Сообщение Re[6]: Ищу удалёнку senior java или c++. от 21.04.2024 19:12
Изменено 21.04.2024 19:29 dimgel
Re[6]: Ищу удалёнку senior java или c++.
Здравствуйте, elmal, Вы писали.
М-да................. Придётся отвечать. Вместо того, чтобы чем-нибудь полезным заняться, например продолжить восстанавливать жава-рефлексы.
TLDR: Если я был паршивой овцой, то почему на меня так назойливо пытались спихнуть твоё второе поделие, заморозив мою работу над первым?
---
Не хотелось бы тебя расстраивать, но ускорял твой говнокод именно я. Едва выйдя на работу, купив ipad, установив на него клиента, подключившись к общей тестовой базе (1-2GB), увидев этот лютый звездец, я сразу сказал менеджеру: развивай-не развивай, сколько фичей не накручивай, ТАКИМИ тормозами не будет пользоваться НИКТО. Поскольку оспаривать эту очевидную мысль может только клинический идиот, мы сразу договорились, что оптимизация -- это фича top priority.
Не помню точно исходной договорённости, возможно она была моей стандартной: рефакторим и делаем тикеты попеременно. Пытался что-то рефакторить я только первые 2 месяца, а потом сказал, что это -- только под нож. И мы договорились о переписывании и согласовали сроки, в которые я, как и написано в моём резюме, укладывался. Если для тебя 8 месяцев (или сколько там на самом деле было) -- до хрена, то это твои проблемы. Тот факт, что за 2 месяца до окончания СОГЛАСОВАННОГО срока с меня потребовали результат в течение недели -- не моя вина. Если из бабы на 7-м месяце попытаться силой вынуть ребёночка, получится трупик (это называется "аборт", на поздних сроках не рекомендуется).
Причём то, что твой говнокод в принципе неподдерживаемый, я понял уже через 2 недели. Но вбитая с пелёнок идиотская максима "переписывать с нуля -- никогда и ни в коем случае" заставила меня потерять на попытки распутать это спагетти как раз столько времени, сколько мне хватило бы, чтобы успеть к "неожиданно изменившимся срокам". С другой стороны, через 2 недели после начала работы убедить начальство на переписывание было малореально. Так что ребёночек один хрен был не жилец. Тем более, как ты написал, "сама концепция неверна и нежизнеспособна". Жаль, конечно: так близко был шанс хоть что-то довести до ума, а потом почивать на лаврах, щёлкая тикеты как семечки.
---
Например, невозможно "отрефакторить" твой протокол инкрементальной выгрузки данных на клиенты (stateful, хранящий на сервере информацию кому что отдали -- charming :/ ) на REST. Между ними вообще ничего общего, и никакого другого решения кроме переписывания тут не может быть в принципе -- и структуры базы, и точек входа, и соответственно части кода клиентов. И вообще, "рефакторинг" -- это "изменение структуры кода без изменения его функциональности", так что даже формально -- мимо. То, что ускорение (за счёт выкидывания лишних sql) получилось всего 86/40=2.15 раза, меня несколько разочаровало, мне мечталось выйти в итоге на 100 раз а не 86 (люблю круглые числа), но с другой стороны, слухи о bottleneck-нусти sql-я несколько преувеличены (по крайней мере на однохостовых сервисах).
---
Или возьмём твою систему кеширования. Если вдруг забыл (хотя пишу это всё я ВООБЩЕ не для тебя), это был обыкновенный HashMap: ключ -- entity id, а значение -- нет, не entity, а container1(container2(container3(entity))). Все три контейнера одноэлементные, разных классов, и самый смак в том, что ЕМНИП 2-й из них был по совместительству прокси, т.е. вызывал методы хранимого объекта через рефлексию. Т.е. получение entity по id было схематически таким: hashMap.get(id).get().get().get(), при этом третий get() вызывался через рефлексию. Поздравляю тебя, Шарик, это успешная заявка на КМС по говнокодингу (т.е. топчик, т.к. "мастер спорта" в этой номинации не выдают). Лепить отмазки, что я это всё придумал и ничего такого не было, -- не надо: придумать ТАКОЕ я бы не смог, такое мне даже в кошмаре не приснится. Что я неправильно понял и что в этом был какой-то высший смысл -- тоже не надо: высшим смыслом оказалось этот твой кеш просто грохнуть.
И грохнул я его как раз в первые два месяца. С некоторым опасением: не станет ли сильно медленнее. Если не сильно, то пофиг: скомпенсируем по мере дальнейшего упрощения кода, потому что рано или поздно я таки-доберусь до причины лютых тормозов. (Запускать профайлер сразу не было никакого смысла: ну покажет он узкое место, а как я туда доберсь через такое спагетти и что смогу сделать?) То, что в результате я получил ускорение в 40 раз, -- меня прямо скажем изумило. Но и вдохновило тоже, и возможно стало фактором, что я смог уболтать менеджера на переписывание: одно достиженьице в активе уже имелось.
Но хотя этот твой кеш и был эталонным памятником идиотизму, всё-таки на 40-кратное замедление он никак не тянул. Только сильно позже до меня дошло в чём дело: я узнал, что тестовый сайт крутится на самом дешёвом хецнеровском VPS, и судя по всему из свопов вообще не вылезает. Естественно, ему любой кеш -- хоть твой, хоть нормальный -- был как серпом по и так забитой под завязку памяти. Можете зачесть это в мой непрофессионализм: за 10 предыдущих лет коммерческого кодинга, мне ни разу не попадались настолько тупорылые жлобы, неспособные посчитать, что на простое их сотрудников в ожидании отклика полуживого сервера, они теряют на порядки больше денег, чем потратили бы на аренду сносного dedicated; и я не мог даже предположить, что на поддерживаемом развиваемом проекте такая ситуация может считаться нормой, и никто из сотрудников не жужжит. (Впрочем, чего им жужжать: солдат спит -- служба идёт.)
---
Когда мидл выкатил идею REST, я мгновенно понял, что во-первых действительно есть ради чего переписывать, а во-вторых, тут никакие кеши не нужны вообще. Т.е. сразу стала видна конечная цель -- конечная архитектура. Вполне простая и типовая. На тот момент у меня отношения с REST были как сейчас с распределёнными системами: прочитано много, опыта проектирования нет. Может поэтому я сам не допёр до этой идеи, но в большей степени наверное из-за вышеупомянутого само-запрета всё ломать под корень, автоматически сужавшего моё поле зрения-возможностей до мелких локальных переделок, не ломающих архитектуру. Естественно, пройти мимо такого шанса я не мог, и сам и спеку нового API написал для ios- & android-разработчиков, и несколько первых точек входа обкатал. Не думаю, что мидл был в обиде: я его научил в stateless, в lightweight ORM и anemic domain model, в эффективность в целом -- всё то, чего я начитался за несколько лет на RSDN и смог наконец-то хоть кому-то передать только на реальном примере. Недавно милейше пообщались.
---
Так вот, с одной стороны я поначалу прощёлкал причину тормозов (полудохлый VPS), но с другой стороны -- "моя" (т.е. наша) реализация сносно шурует даже на полудохлом VPS, а твоя -- лежит намертво.
Когда мы кодили новое REST API, ios- & android-программисты шли за нами след в след. То что якобы кто-то ещё ускорял этот проект, и я за несколько месяцев об этом не узнал, означает что либо они успевали на два фронта, либо этот второй вносил мелкие фиксы в старую, фактически замороженную ветку, чтобы поддерживать в рабочем состоянии хоть какую-то версию, пока я не закончу свою. Как называлась моя ветка -- "отдельная" или ещё какая -- не имеет значения, она была главной.
Выбросить весь этот труд на помойку -- прекрасная мотивация чтобы взвалить на себя ещё одну кучу говна, которая не обещает быть лучше первой. Возможно, если бы мне кто-нибудь удосужился рассказать всё вот это про "неверную и нежизнеспособную концепцию", а не просто "пшёл нах отсюда, но можешь покормиться ещё тут" -- впрочем, вряд ли: наелся я уже твоих поделий.
---
А теперь перейдём на личности. Про мою "нормальность".
Начнём с нормальности работодателя. Для которого норма -- задерживать зарплату; а после увольнения я смог получить расчёт, только выждав все предусмотренные договором (и не только) сроки и выкатив претензию -- такую претензию, что не подкопается никто (чему читавшие её -- я это знаю -- сильно печалились). Для которого норма -- не подписывать договора и акты с хамской отпиской "вас много, я одна" (причём вторая часть этого утверждения -- общеизвестное враньё). У которого тыща пятниц на неделе, недееспособные болтуны-менеджеры, фавориты-говнокодеры, и соответствующий жизненный цикл проектов. Единственное осмысленное объяснение -- они просто пилили бабло (софт для госструктур же), а на проекты им было насрать.
Но это ерунда. "Давайте лучше о Вас."
1. Что ты, пользуясь знакомством с учредителями, сбрасываешь с себя ответственность за свои поделия -- это не моя формулировка. (Кто мне это рассказал -- не сказал бы, даже если бы помнил.) Но два примера такого скидывания ответственности у меня перед глазами.
2. Твоя назойливая фиксация на моей "провинциальности" -- дескать, "ты, замухрышка, должна быть счастлива уже от того, что столичный барин тебя отыметь изволил" -- это настолько убогие понты и такая лютая дичь, что даже не знаю, что ответить... А хотя знаю. В эту же кассу хвастовство, что работал в говноконторе под жёстким прессингом и прошёл там огонь, воду и медные трубы. Гордиться и хвастаться неконструктивщиной -- это удел никчёмностей, которым хвастаться больше нечем. Причём для этого психотипа характерна именно вдохновенность и высокопарность хвастовства. Как говорил один товарищ (книгу которого я упомяну по ссылке ниже), сделать не могут ничего, но презентовать и продать -- идеальны. Гы, например в твоём случае -- продать себя работодателю.
2.a. Причём в твоём случае всё даже хуже: я тут вспомнил, что в тестовом задании корректно обрабатывал какие-то хитрые случаи (что-то типа возможного разрыва пакета, подсовывал используемой либе починенные данные) и вообще пришёл на собеседование до ужоса довольный собой -- production quality запилил; но на собеседовании ты докапывался до такой ерунды (даже не помню, толи форматирование кода, то ли ещё что-то в этом же духе), что я в полной растерянности даже ответить ничего не смог, промямлил что-то невразумительное.
Тут на кывте ни для кого не секрет, что докапываются до каждой запятой чтобы сбить зарплату и/или посамоутверждаться за чужой счёт. Потому что для никчемности, посамоутвержлаться для чужой счёт -- самый хлеб.
Фух. Как это у писателей называется? Графоманство, во.
Впрочем, код я с такой же скоростью пишу.
И качеством сильно получше, чем у некоторых.
М-да................. Придётся отвечать. Вместо того, чтобы чем-нибудь полезным заняться, например продолжить восстанавливать жава-рефлексы.
TLDR: Если я был паршивой овцой, то почему на меня так назойливо пытались спихнуть твоё второе поделие, заморозив мою работу над первым?
---
Не хотелось бы тебя расстраивать, но ускорял твой говнокод именно я. Едва выйдя на работу, купив ipad, установив на него клиента, подключившись к общей тестовой базе (1-2GB), увидев этот лютый звездец, я сразу сказал менеджеру: развивай-не развивай, сколько фичей не накручивай, ТАКИМИ тормозами не будет пользоваться НИКТО. Поскольку оспаривать эту очевидную мысль может только клинический идиот, мы сразу договорились, что оптимизация -- это фича top priority.
Не помню точно исходной договорённости, возможно она была моей стандартной: рефакторим и делаем тикеты попеременно. Пытался что-то рефакторить я только первые 2 месяца, а потом сказал, что это -- только под нож. И мы договорились о переписывании и согласовали сроки, в которые я, как и написано в моём резюме, укладывался. Если для тебя 8 месяцев (или сколько там на самом деле было) -- до хрена, то это твои проблемы. Тот факт, что за 2 месяца до окончания СОГЛАСОВАННОГО срока с меня потребовали результат в течение недели -- не моя вина. Если из бабы на 7-м месяце попытаться силой вынуть ребёночка, получится трупик (это называется "аборт", на поздних сроках не рекомендуется).
Причём то, что твой говнокод в принципе неподдерживаемый, я понял уже через 2 недели. Но вбитая с пелёнок идиотская максима "переписывать с нуля -- никогда и ни в коем случае" заставила меня потерять на попытки распутать это спагетти как раз столько времени, сколько мне хватило бы, чтобы успеть к "неожиданно изменившимся срокам". С другой стороны, через 2 недели после начала работы убедить начальство на переписывание было малореально. Так что ребёночек один хрен был не жилец. Тем более, как ты написал, "сама концепция неверна и нежизнеспособна". Жаль, конечно: так близко был шанс хоть что-то довести до ума, а потом почивать на лаврах, щёлкая тикеты как семечки.
---
Например, невозможно "отрефакторить" твой протокол инкрементальной выгрузки данных на клиенты (stateful, хранящий на сервере информацию кому что отдали -- charming :/ ) на REST. Между ними вообще ничего общего, и никакого другого решения кроме переписывания тут не может быть в принципе -- и структуры базы, и точек входа, и соответственно части кода клиентов. И вообще, "рефакторинг" -- это "изменение структуры кода без изменения его функциональности", так что даже формально -- мимо. То, что ускорение (за счёт выкидывания лишних sql) получилось всего 86/40=2.15 раза, меня несколько разочаровало, мне мечталось выйти в итоге на 100 раз а не 86 (люблю круглые числа), но с другой стороны, слухи о bottleneck-нусти sql-я несколько преувеличены (по крайней мере на однохостовых сервисах).
---
Или возьмём твою систему кеширования. Если вдруг забыл (хотя пишу это всё я ВООБЩЕ не для тебя), это был обыкновенный HashMap: ключ -- entity id, а значение -- нет, не entity, а container1(container2(container3(entity))). Все три контейнера одноэлементные, разных классов, и самый смак в том, что ЕМНИП 2-й из них был по совместительству прокси, т.е. вызывал методы хранимого объекта через рефлексию. Т.е. получение entity по id было схематически таким: hashMap.get(id).get().get().get(), при этом третий get() вызывался через рефлексию. Поздравляю тебя, Шарик, это успешная заявка на КМС по говнокодингу (т.е. топчик, т.к. "мастер спорта" в этой номинации не выдают). Лепить отмазки, что я это всё придумал и ничего такого не было, -- не надо: придумать ТАКОЕ я бы не смог, такое мне даже в кошмаре не приснится. Что я неправильно понял и что в этом был какой-то высший смысл -- тоже не надо: высшим смыслом оказалось этот твой кеш просто грохнуть.
И грохнул я его как раз в первые два месяца. С некоторым опасением: не станет ли сильно медленнее. Если не сильно, то пофиг: скомпенсируем по мере дальнейшего упрощения кода, потому что рано или поздно я таки-доберусь до причины лютых тормозов. (Запускать профайлер сразу не было никакого смысла: ну покажет он узкое место, а как я туда доберсь через такое спагетти и что смогу сделать?) То, что в результате я получил ускорение в 40 раз, -- меня прямо скажем изумило. Но и вдохновило тоже, и возможно стало фактором, что я смог уболтать менеджера на переписывание: одно достиженьице в активе уже имелось.
Но хотя этот твой кеш и был эталонным памятником идиотизму, всё-таки на 40-кратное замедление он никак не тянул. Только сильно позже до меня дошло в чём дело: я узнал, что тестовый сайт крутится на самом дешёвом хецнеровском VPS, и судя по всему из свопов вообще не вылезает. Естественно, ему любой кеш -- хоть твой, хоть нормальный -- был как серпом по и так забитой под завязку памяти. Можете зачесть это в мой непрофессионализм: за 10 предыдущих лет коммерческого кодинга, мне ни разу не попадались настолько тупорылые жлобы, неспособные посчитать, что на простое их сотрудников в ожидании отклика полуживого сервера, они теряют на порядки больше денег, чем потратили бы на аренду сносного dedicated; и я не мог даже предположить, что на поддерживаемом развиваемом проекте такая ситуация может считаться нормой, и никто из сотрудников не жужжит. (Впрочем, чего им жужжать: солдат спит -- служба идёт.)
---
Когда мидл выкатил идею REST, я мгновенно понял, что во-первых действительно есть ради чего переписывать, а во-вторых, тут никакие кеши не нужны вообще. Т.е. сразу стала видна конечная цель -- конечная архитектура. Вполне простая и типовая. На тот момент у меня отношения с REST были как сейчас с распределёнными системами: прочитано много, опыта проектирования нет. Может поэтому я сам не допёр до этой идеи, но в большей степени наверное из-за вышеупомянутого само-запрета всё ломать под корень, автоматически сужавшего моё поле зрения-возможностей до мелких локальных переделок, не ломающих архитектуру. Естественно, пройти мимо такого шанса я не мог, и сам и спеку нового API написал для ios- & android-разработчиков, и несколько первых точек входа обкатал. Не думаю, что мидл был в обиде: я его научил в stateless, в lightweight ORM и anemic domain model, в эффективность в целом -- всё то, чего я начитался за несколько лет на RSDN и смог наконец-то хоть кому-то передать только на реальном примере. Недавно милейше пообщались.
---
Так вот, с одной стороны я поначалу прощёлкал причину тормозов (полудохлый VPS), но с другой стороны -- "моя" (т.е. наша) реализация сносно шурует даже на полудохлом VPS, а твоя -- лежит намертво.
Когда мы кодили новое REST API, ios- & android-программисты шли за нами след в след. То что якобы кто-то ещё ускорял этот проект, и я за несколько месяцев об этом не узнал, означает что либо они успевали на два фронта, либо этот второй вносил мелкие фиксы в старую, фактически замороженную ветку, чтобы поддерживать в рабочем состоянии хоть какую-то версию, пока я не закончу свою. Как называлась моя ветка -- "отдельная" или ещё какая -- не имеет значения, она была главной.
Выбросить весь этот труд на помойку -- прекрасная мотивация чтобы взвалить на себя ещё одну кучу говна, которая не обещает быть лучше первой. Возможно, если бы мне кто-нибудь удосужился рассказать всё вот это про "неверную и нежизнеспособную концепцию", а не просто "пшёл нах отсюда, но можешь покормиться ещё тут" -- впрочем, вряд ли: наелся я уже твоих поделий.
---
А теперь перейдём на личности. Про мою "нормальность".
Начнём с нормальности работодателя. Для которого норма -- задерживать зарплату; а после увольнения я смог получить расчёт, только выждав все предусмотренные договором (и не только) сроки и выкатив претензию -- такую претензию, что не подкопается никто (чему читавшие её -- я это знаю -- сильно печалились). Для которого норма -- не подписывать договора и акты с хамской отпиской "вас много, я одна" (причём вторая часть этого утверждения -- общеизвестное враньё). У которого тыща пятниц на неделе, недееспособные болтуны-менеджеры, фавориты-говнокодеры, и соответствующий жизненный цикл проектов. Единственное осмысленное объяснение -- они просто пилили бабло (софт для госструктур же), а на проекты им было насрать.
Но это ерунда. "Давайте лучше о Вас."
1. Что ты, пользуясь знакомством с учредителями, сбрасываешь с себя ответственность за свои поделия -- это не моя формулировка. (Кто мне это рассказал -- не сказал бы, даже если бы помнил.) Но два примера такого скидывания ответственности у меня перед глазами.
2. Твоя назойливая фиксация на моей "провинциальности" -- дескать, "ты, замухрышка, должна быть счастлива уже от того, что столичный барин тебя отыметь изволил" -- это настолько убогие понты и такая лютая дичь, что даже не знаю, что ответить... А хотя знаю. В эту же кассу хвастовство, что работал в говноконторе под жёстким прессингом и прошёл там огонь, воду и медные трубы. Гордиться и хвастаться неконструктивщиной -- это удел никчёмностей, которым хвастаться больше нечем. Причём для этого психотипа характерна именно вдохновенность и высокопарность хвастовства. Как говорил один товарищ (книгу которого я упомяну по ссылке ниже), сделать не могут ничего, но презентовать и продать -- идеальны. Гы, например в твоём случае -- продать себя работодателю.
2.a. Причём в твоём случае всё даже хуже: я тут вспомнил, что в тестовом задании корректно обрабатывал какие-то хитрые случаи (что-то типа возможного разрыва пакета, подсовывал используемой либе починенные данные) и вообще пришёл на собеседование до ужоса довольный собой -- production quality запилил; но на собеседовании ты докапывался до такой ерунды (даже не помню, толи форматирование кода, то ли ещё что-то в этом же духе), что я в полной растерянности даже ответить ничего не смог, промямлил что-то невразумительное.
Фух. Как это у писателей называется? Графоманство, во.
Re[6]: Ищу удалёнку senior java или c++.
Здравствуйте, elmal, Вы писали.
М-да................. Придётся отвечать. Вместо того, чтобы чем-нибудь полезным заняться, например продолжить восстанавливать жава-рефлексы.
TLDR: Если я был паршивой овцой, то почему на меня так назойливо пытались спихнуть твоё второе поделие, заморозив мою работу над первым?
---
Не хотелось бы тебя расстраивать, но ускорял твой говнокод именно я. Едва выйдя на работу, купив ipad, установив на него клиента, подключившись к общей тестовой базе (1-2GB), увидев этот лютый звездец, я сразу сказал менеджеру: развивай-не развивай, сколько фичей не накручивай, ТАКИМИ тормозами не будет пользоваться НИКТО. Поскольку оспаривать эту очевидную мысль может только клинический идиот, мы сразу договорились, что оптимизация -- это фича top priority.
Не помню точно исходной договорённости, возможно она была моей стандартной: рефакторим и делаем тикеты попеременно. Пытался что-то рефакторить я только первые 2 месяца, а потом сказал, что это -- только под нож. И мы договорились о переписывании и согласовали сроки, в которые я, как и написано в моём резюме, укладывался. Если для тебя 8 месяцев (или сколько там на самом деле было) -- до хрена, то это твои проблемы. Тот факт, что за 2 месяца до окончания СОГЛАСОВАННОГО срока с меня потребовали результат в течение недели -- не моя вина. Если из бабы на 7-м месяце попытаться силой вынуть ребёночка, получится трупик (это называется "аборт", на поздних сроках не рекомендуется).
Причём то, что твой говнокод в принципе неподдерживаемый, я понял уже через 2 недели. Но вбитая с пелёнок идиотская максима "переписывать с нуля -- никогда и ни в коем случае" заставила меня потерять на попытки распутать это спагетти как раз столько времени, сколько мне хватило бы, чтобы успеть к "неожиданно изменившимся срокам". С другой стороны, через 2 недели после начала работы убедить начальство на переписывание было малореально. Так что ребёночек один хрен был не жилец. Тем более, как ты написал, "сама концепция неверна и нежизнеспособна". Жаль, конечно: так близко был шанс хоть что-то довести до ума, а потом почивать на лаврах, щёлкая тикеты как семечки.
---
Например, невозможно "отрефакторить" твой протокол инкрементальной выгрузки данных на клиенты (stateful, хранящий на сервере информацию кому что отдали -- charming :/ ) на REST. Между ними вообще ничего общего, и никакого другого решения кроме переписывания тут не может быть в принципе -- и структуры базы, и точек входа, и соответственно части кода клиентов. И вообще, "рефакторинг" -- это "изменение структуры кода без изменения его функциональности", так что даже формально -- мимо. То, что ускорение (за счёт выкидывания лишних sql) получилось всего 86/40=2.15 раза, меня несколько разочаровало, мне мечталось выйти в итоге на 100 раз а не 86 (люблю круглые числа), но с другой стороны, слухи о bottleneck-нусти sql-я несколько преувеличены (по крайней мере на однохостовых сервисах).
---
Или возьмём твою систему кеширования. Если вдруг забыл (хотя пишу это всё я ВООБЩЕ не для тебя), это был обыкновенный HashMap: ключ -- entity id, а значение -- нет, не entity, а container1(container2(container3(entity))). Все три контейнера одноэлементные, разных классов, и самый смак в том, что ЕМНИП 2-й из них был по совместительству прокси, т.е. вызывал методы хранимого объекта через рефлексию. Т.е. получение entity по id было схематически таким: hashMap.get(id).get().get().get(), при этом третий get() вызывался через рефлексию. Поздравляю тебя, Шарик, это успешная заявка на КМС по говнокодингу (т.е. топчик, т.к. "мастер спорта" в этой номинации не выдают). Лепить отмазки, что я это всё придумал и ничего такого не было, -- не надо: придумать ТАКОЕ я бы не смог, такое мне даже в кошмаре не приснится. Что я неправильно понял и что в этом был какой-то высший смысл -- тоже не надо: высшим смыслом оказалось этот твой кеш просто грохнуть.
И грохнул я его как раз в первые два месяца. С некоторым опасением: не станет ли сильно медленнее. Если не сильно, то пофиг: скомпенсируем по мере дальнейшего упрощения кода, потому что рано или поздно я таки-доберусь до причины лютых тормозов. (Запускать профайлер сразу не было никакого смысла: ну покажет он узкое место, а как я туда доберсь через такое спагетти и что смогу сделать?) То, что в результате я получил ускорение в 40 раз, -- меня прямо скажем изумило. Но и вдохновило тоже, и возможно стало фактором, что я смог уболтать менеджера на переписывание: одно достиженьице в активе уже имелось.
Но хотя этот твой кеш и был эталонным памятником идиотизму, всё-таки на 40-кратное замедление он никак не тянул. Только сильно позже до меня дошло в чём дело: я узнал, что тестовый сайт крутится на самом дешёвом хецнеровском VPS, и судя по всему из свопов вообще не вылезает. Естественно, ему любой кеш -- хоть твой, хоть нормальный -- был как серпом по и так забитой под завязку памяти. Можете зачесть это в мой непрофессионализм: за 10 предыдущих лет коммерческого кодинга, мне ни разу не попадались настолько тупорылые жлобы, неспособные посчитать, что на простое их сотрудников в ожидании отклика полуживого сервера, они теряют на порядки больше денег, чем потратили бы на аренду сносного dedicated; и я не мог даже предположить, что на поддерживаемом развиваемом проекте такая ситуация может считаться нормой, и никто из сотрудников не жужжит. (Впрочем, чего им жужжать: солдат спит -- служба идёт.)
---
Когда мидл выкатил идею REST, я мгновенно понял, что во-первых действительно есть ради чего переписывать, а во-вторых, тут никакие кеши не нужны вообще. Т.е. сразу стала видна конечная цель -- конечная архитектура. Вполне простая и типовая. На тот момент у меня отношения с REST были как сейчас с распределёнными системами: прочитано много, опыта проектирования нет. Может поэтому я сам не допёр до этой идеи, но в большей степени наверное из-за вышеупомянутого само-запрета всё ломать под корень, автоматически сужавшего моё поле зрения-возможностей до мелких локальных переделок, не ломающих архитектуру. Естественно, пройти мимо такого шанса я не мог, и сам и спеку нового API написал для ios- & android-разработчиков, и несколько первых точек входа обкатал. Не думаю, что мидл был в обиде: я его научил в stateless, в lightweight ORM и anemic domain model, в эффективность в целом -- всё то, чего я начитался за несколько лет на RSDN и смог наконец-то хоть кому-то передать только на реальном примере. Недавно милейше пообщались.
---
Так вот, с одной стороны я поначалу прощёлкал причину тормозов (полудохлый VPS), но с другой стороны -- "моя" (т.е. наша) реализация сносно шурует даже на полудохлом VPS, а твоя -- лежит намертво.
Когда мы кодили новое REST API, ios- & android-программисты шли за нами след в след. То что якобы кто-то ещё ускорял этот проект, и я за несколько месяцев об этом не узнал, означает что либо они успевали на два фронта, либо этот второй вносил мелкие фиксы в старую, фактически замороженную ветку, чтобы поддерживать в рабочем состоянии хоть какую-то версию, пока я не закончу свою. Как называлась моя ветка -- "отдельная" или ещё какая -- не имеет значения, она была главной.
Выбросить весь этот труд на помойку -- прекрасная мотивация чтобы взвалить на себя ещё одну кучу говна, которая не обещает быть лучше первой. Возможно, если бы мне кто-нибудь удосужился рассказать всё вот это про "неверную и нежизнеспособную концепцию", а не просто "пшёл нах отсюда, но можешь покормиться ещё тут"... Впрочем, вряд ли: наелся я уже твоих поделий.
---
А теперь перейдём на личности. Про мою "нормальность".
Начнём с нормальности работодателя. Для которого норма -- задерживать зарплату; а после увольнения я смог получить расчёт, только выждав все предусмотренные договором (и не только) сроки и выкатив претензию -- такую претензию, что не подкопается никто (чему читавшие её -- я это знаю -- сильно печалились). Для которого норма -- не подписывать договора и акты с хамской отпиской "вас много, я одна" (причём вторая часть этого утверждения -- общеизвестное враньё). У которого тыща пятниц на неделе, недееспособные болтуны-менеджеры, фавориты-говнокодеры, и соответствующий жизненный цикл проектов. Единственное осмысленное объяснение -- они просто пилили бабло (софт для госструктур же), а на проекты им было насрать.
Но это ерунда. "Давайте лучше о Вас."
1. Что ты, пользуясь знакомством с учредителями, сбрасываешь с себя ответственность за свои поделия -- это не моя формулировка. (Кто мне это рассказал -- не сказал бы, даже если бы помнил.) Но два примера такого скидывания ответственности у меня перед глазами.
2. Твоя назойливая фиксация на моей "провинциальности" -- дескать, "ты, замухрышка, должна быть счастлива уже от того, что столичный барин тебя отыметь изволил" -- это настолько убогие понты и такая лютая дичь, что даже не знаю, что ответить... А хотя знаю. В эту же кассу хвастовство, что работал в говноконторе под жёстким прессингом и прошёл там огонь, воду и медные трубы. Гордиться и хвастаться неконструктивщиной -- это удел никчёмностей, которым хвастаться больше нечем. Причём для этого психотипа характерна именно вдохновенность и высокопарность хвастовства. Как говорил один товарищ (книгу которого я упомяну по ссылке ниже), сделать не могут ничего, но презентовать и продать -- идеальны. Гы, например в твоём случае -- продать себя работодателю.
2.a. Причём в твоём случае всё даже хуже: я тут вспомнил, что в тестовом задании корректно обрабатывал какие-то хитрые случаи (что-то типа возможного разрыва пакета, подсовывал используемой либе починенные данные) и вообще пришёл на собеседование до ужоса довольный собой -- production quality запилил; но на собеседовании ты докапывался до такой ерунды (даже не помню, толи форматирование кода, то ли ещё что-то в этом же духе), что я в полной растерянности даже ответить ничего не смог, промямлил что-то невразумительное.
Тут на кывте ни для кого не секрет, что докапываются до каждой запятой чтобы сбить зарплату и/или посамоутверждаться за чужой счёт. Потому что для никчемности, посамоутверждаться для чужой счёт -- самый хлеб.
Фух. Как это у писателей называется? Графоманство, во.
Впрочем, код я с такой же скоростью пишу.
И качеством сильно получше, чем у некоторых.
М-да................. Придётся отвечать. Вместо того, чтобы чем-нибудь полезным заняться, например продолжить восстанавливать жава-рефлексы.
TLDR: Если я был паршивой овцой, то почему на меня так назойливо пытались спихнуть твоё второе поделие, заморозив мою работу над первым?
---
Не хотелось бы тебя расстраивать, но ускорял твой говнокод именно я. Едва выйдя на работу, купив ipad, установив на него клиента, подключившись к общей тестовой базе (1-2GB), увидев этот лютый звездец, я сразу сказал менеджеру: развивай-не развивай, сколько фичей не накручивай, ТАКИМИ тормозами не будет пользоваться НИКТО. Поскольку оспаривать эту очевидную мысль может только клинический идиот, мы сразу договорились, что оптимизация -- это фича top priority.
Не помню точно исходной договорённости, возможно она была моей стандартной: рефакторим и делаем тикеты попеременно. Пытался что-то рефакторить я только первые 2 месяца, а потом сказал, что это -- только под нож. И мы договорились о переписывании и согласовали сроки, в которые я, как и написано в моём резюме, укладывался. Если для тебя 8 месяцев (или сколько там на самом деле было) -- до хрена, то это твои проблемы. Тот факт, что за 2 месяца до окончания СОГЛАСОВАННОГО срока с меня потребовали результат в течение недели -- не моя вина. Если из бабы на 7-м месяце попытаться силой вынуть ребёночка, получится трупик (это называется "аборт", на поздних сроках не рекомендуется).
Причём то, что твой говнокод в принципе неподдерживаемый, я понял уже через 2 недели. Но вбитая с пелёнок идиотская максима "переписывать с нуля -- никогда и ни в коем случае" заставила меня потерять на попытки распутать это спагетти как раз столько времени, сколько мне хватило бы, чтобы успеть к "неожиданно изменившимся срокам". С другой стороны, через 2 недели после начала работы убедить начальство на переписывание было малореально. Так что ребёночек один хрен был не жилец. Тем более, как ты написал, "сама концепция неверна и нежизнеспособна". Жаль, конечно: так близко был шанс хоть что-то довести до ума, а потом почивать на лаврах, щёлкая тикеты как семечки.
---
Например, невозможно "отрефакторить" твой протокол инкрементальной выгрузки данных на клиенты (stateful, хранящий на сервере информацию кому что отдали -- charming :/ ) на REST. Между ними вообще ничего общего, и никакого другого решения кроме переписывания тут не может быть в принципе -- и структуры базы, и точек входа, и соответственно части кода клиентов. И вообще, "рефакторинг" -- это "изменение структуры кода без изменения его функциональности", так что даже формально -- мимо. То, что ускорение (за счёт выкидывания лишних sql) получилось всего 86/40=2.15 раза, меня несколько разочаровало, мне мечталось выйти в итоге на 100 раз а не 86 (люблю круглые числа), но с другой стороны, слухи о bottleneck-нусти sql-я несколько преувеличены (по крайней мере на однохостовых сервисах).
---
Или возьмём твою систему кеширования. Если вдруг забыл (хотя пишу это всё я ВООБЩЕ не для тебя), это был обыкновенный HashMap: ключ -- entity id, а значение -- нет, не entity, а container1(container2(container3(entity))). Все три контейнера одноэлементные, разных классов, и самый смак в том, что ЕМНИП 2-й из них был по совместительству прокси, т.е. вызывал методы хранимого объекта через рефлексию. Т.е. получение entity по id было схематически таким: hashMap.get(id).get().get().get(), при этом третий get() вызывался через рефлексию. Поздравляю тебя, Шарик, это успешная заявка на КМС по говнокодингу (т.е. топчик, т.к. "мастер спорта" в этой номинации не выдают). Лепить отмазки, что я это всё придумал и ничего такого не было, -- не надо: придумать ТАКОЕ я бы не смог, такое мне даже в кошмаре не приснится. Что я неправильно понял и что в этом был какой-то высший смысл -- тоже не надо: высшим смыслом оказалось этот твой кеш просто грохнуть.
И грохнул я его как раз в первые два месяца. С некоторым опасением: не станет ли сильно медленнее. Если не сильно, то пофиг: скомпенсируем по мере дальнейшего упрощения кода, потому что рано или поздно я таки-доберусь до причины лютых тормозов. (Запускать профайлер сразу не было никакого смысла: ну покажет он узкое место, а как я туда доберсь через такое спагетти и что смогу сделать?) То, что в результате я получил ускорение в 40 раз, -- меня прямо скажем изумило. Но и вдохновило тоже, и возможно стало фактором, что я смог уболтать менеджера на переписывание: одно достиженьице в активе уже имелось.
Но хотя этот твой кеш и был эталонным памятником идиотизму, всё-таки на 40-кратное замедление он никак не тянул. Только сильно позже до меня дошло в чём дело: я узнал, что тестовый сайт крутится на самом дешёвом хецнеровском VPS, и судя по всему из свопов вообще не вылезает. Естественно, ему любой кеш -- хоть твой, хоть нормальный -- был как серпом по и так забитой под завязку памяти. Можете зачесть это в мой непрофессионализм: за 10 предыдущих лет коммерческого кодинга, мне ни разу не попадались настолько тупорылые жлобы, неспособные посчитать, что на простое их сотрудников в ожидании отклика полуживого сервера, они теряют на порядки больше денег, чем потратили бы на аренду сносного dedicated; и я не мог даже предположить, что на поддерживаемом развиваемом проекте такая ситуация может считаться нормой, и никто из сотрудников не жужжит. (Впрочем, чего им жужжать: солдат спит -- служба идёт.)
---
Когда мидл выкатил идею REST, я мгновенно понял, что во-первых действительно есть ради чего переписывать, а во-вторых, тут никакие кеши не нужны вообще. Т.е. сразу стала видна конечная цель -- конечная архитектура. Вполне простая и типовая. На тот момент у меня отношения с REST были как сейчас с распределёнными системами: прочитано много, опыта проектирования нет. Может поэтому я сам не допёр до этой идеи, но в большей степени наверное из-за вышеупомянутого само-запрета всё ломать под корень, автоматически сужавшего моё поле зрения-возможностей до мелких локальных переделок, не ломающих архитектуру. Естественно, пройти мимо такого шанса я не мог, и сам и спеку нового API написал для ios- & android-разработчиков, и несколько первых точек входа обкатал. Не думаю, что мидл был в обиде: я его научил в stateless, в lightweight ORM и anemic domain model, в эффективность в целом -- всё то, чего я начитался за несколько лет на RSDN и смог наконец-то хоть кому-то передать только на реальном примере. Недавно милейше пообщались.
---
Так вот, с одной стороны я поначалу прощёлкал причину тормозов (полудохлый VPS), но с другой стороны -- "моя" (т.е. наша) реализация сносно шурует даже на полудохлом VPS, а твоя -- лежит намертво.
Когда мы кодили новое REST API, ios- & android-программисты шли за нами след в след. То что якобы кто-то ещё ускорял этот проект, и я за несколько месяцев об этом не узнал, означает что либо они успевали на два фронта, либо этот второй вносил мелкие фиксы в старую, фактически замороженную ветку, чтобы поддерживать в рабочем состоянии хоть какую-то версию, пока я не закончу свою. Как называлась моя ветка -- "отдельная" или ещё какая -- не имеет значения, она была главной.
Выбросить весь этот труд на помойку -- прекрасная мотивация чтобы взвалить на себя ещё одну кучу говна, которая не обещает быть лучше первой. Возможно, если бы мне кто-нибудь удосужился рассказать всё вот это про "неверную и нежизнеспособную концепцию", а не просто "пшёл нах отсюда, но можешь покормиться ещё тут"... Впрочем, вряд ли: наелся я уже твоих поделий.
---
А теперь перейдём на личности. Про мою "нормальность".
Начнём с нормальности работодателя. Для которого норма -- задерживать зарплату; а после увольнения я смог получить расчёт, только выждав все предусмотренные договором (и не только) сроки и выкатив претензию -- такую претензию, что не подкопается никто (чему читавшие её -- я это знаю -- сильно печалились). Для которого норма -- не подписывать договора и акты с хамской отпиской "вас много, я одна" (причём вторая часть этого утверждения -- общеизвестное враньё). У которого тыща пятниц на неделе, недееспособные болтуны-менеджеры, фавориты-говнокодеры, и соответствующий жизненный цикл проектов. Единственное осмысленное объяснение -- они просто пилили бабло (софт для госструктур же), а на проекты им было насрать.
Но это ерунда. "Давайте лучше о Вас."
1. Что ты, пользуясь знакомством с учредителями, сбрасываешь с себя ответственность за свои поделия -- это не моя формулировка. (Кто мне это рассказал -- не сказал бы, даже если бы помнил.) Но два примера такого скидывания ответственности у меня перед глазами.
2. Твоя назойливая фиксация на моей "провинциальности" -- дескать, "ты, замухрышка, должна быть счастлива уже от того, что столичный барин тебя отыметь изволил" -- это настолько убогие понты и такая лютая дичь, что даже не знаю, что ответить... А хотя знаю. В эту же кассу хвастовство, что работал в говноконторе под жёстким прессингом и прошёл там огонь, воду и медные трубы. Гордиться и хвастаться неконструктивщиной -- это удел никчёмностей, которым хвастаться больше нечем. Причём для этого психотипа характерна именно вдохновенность и высокопарность хвастовства. Как говорил один товарищ (книгу которого я упомяну по ссылке ниже), сделать не могут ничего, но презентовать и продать -- идеальны. Гы, например в твоём случае -- продать себя работодателю.
2.a. Причём в твоём случае всё даже хуже: я тут вспомнил, что в тестовом задании корректно обрабатывал какие-то хитрые случаи (что-то типа возможного разрыва пакета, подсовывал используемой либе починенные данные) и вообще пришёл на собеседование до ужоса довольный собой -- production quality запилил; но на собеседовании ты докапывался до такой ерунды (даже не помню, толи форматирование кода, то ли ещё что-то в этом же духе), что я в полной растерянности даже ответить ничего не смог, промямлил что-то невразумительное.
Фух. Как это у писателей называется? Графоманство, во.