Блог о программировании

И попал я в ад...

Категория: Рабочие моменты
 27 февраля 2016 г. 10:50

В поисках

Уволившись из рая для программиста по причине переезда в другой город, пришлось искать тут работу. Долго заморачиваться не хотел, поскольку было много других неотложных дел; нужен был стабильный источник дохода. Так как на предыдущей работе я программировал исключительно на js, естественно, искал вакансию, где мои знания пригодились бы. Как водится, нашей несколько вакансий на хедхантере, отправим резюме и стал ждать. На следующий день уже было назначено два собеседования.
Первое: вакансия php-программиста с активным использованием js. Работа в стартапе, который занимается оцифровкой одного бизнеса. Собеседование продлилось 15 минут, в течении которого, после стандартного опросника меня гоняли по основами ООП и php, нюансах ООП в php. Собеседующий даже не попытался сбить тот оклад, на который я претендую.
Второе: собеседование в крупную телеком компанию на вакансию js-программиста со знанием языка python. Тут меня даже не пытались поймать на каком-нибудь каверзном вопросе, а собеседование, скорее, походило на разговоры давних приятелей. Мы обсуждали современные технологии, их возможности и способы применения. Без особой конкретики. Проболтали около часа, после чего выяснили, что, поскольку о python'е я только слышал, то на зп могу рассчитывать сильно ниже ожидаемой, на 30 процентов. Сошлись на том, что я подумаю.
Благо думать не пришлось, вечером же позвонили с первого собеседования и предложили выходить уже на следующей неделе. Я согласился.


Первый день
Подписав договор, мне сразу же была поставлена первая задача: есть несколько модулей, доступ к которым происходит через разные url-адреса. Мне предстояло объединить их под одним приложением и организовать загрузку каждого из модулей через ajax-запросы в определенную область. Как водится, каждый модуль в веб-интерфейсе использовал библиотеку jQuery кучей навешанных плагинов. А поскольку каждый модуль писался в разное время, значит и библиотеки jQuery были разных версий. Но это еще не все. Предыдущие программисты совершенно не заморачивались в названиях css-селекторов, а посему ситуация, когда один класс использовался в разных модулях, да еще и с разными стилями, стала для меня типичной. Если вы еще не поняли всю печальность данной ситуации, поясню: в каждом модуле своя библиотека jQuery, свои плагины, свои css-стили. Поскольку это все необходимо объединить под одним приложением, то все css-стили и весь js-код грузится в самом начале, а следовательн наложение css-стилей и взаимное исключение работоспособности одних jQuery-плагинов с jQuery-библиотекой другого модуля были повсеместны. Времени переделывать нет, весь функционал неизвестен, а клиенты уже ждут результат. Как сказали, главное, чтобы все это при портировании работало и сносно выглядело. Поскольку раньше таким непотребством заниматься не приходилось, уходя домой, у меня были грустные мысли.

Далее
Конечно же, перелопатив кучу кода, я выполнил задание ~за неделю, но каким способом...
Во-первых, чтобы подружить css-стили одного модуля с css другого модуля, пришлось для каждого модуля создавать свой контейнер с уникальным идентификатором и конкретный css уже применять для определенного контейнера, тем самым решив проблему перекрытия разных стилей друг дружкой. Это еще терпимо;
Во-вторых, чтобы не поломать существующий функционал и не менять зависимости(поскольку время жмёт), пришлось одновременно подключить три разные библиотеки jQuery и для каждой подключать свои плагины. Феерическое решение по сути, но по факту работающее и на первых парах вполне себе подходящее.
В третьих, глубже погрузившись в код, обнаружил множество невероятных решений, которые заслуживали публикации на сайте govnokod.ru. Например, разграничение ролей реализовывалось путем обычной конструкции if-else:
if(( $_SESSION['login']=='oper' ) || ($_SESSION['login']=='operator') || ($_SESSION['login']=='controller')) {
    $tpl->loadTpl('oper');
} else {
    $tpl->loadTpl('default');
}
А нарушения инкапсуляции в классах были везде:
class order {

    var $db;
    var $settings;
    var $user;
    var $order_id;

    function __construct() {
        global $db, $settings;
        $this->db = $db;
        $this->settings = $settings;
        $this->user = auth::getInstance()->user;
    
        ...
    }
}
Ладно, если бы код был написан с использованием классов, так обычным делом пыли портянки кода в 3000 строк с мешаниной из php, HTML, и js.
После предыдущей работы это был кромешный ад. Вся моя жизнь изменилась. Не было теперь структурированного, практически совершенного кода. Меня стали посещать судорожные мысли прекратить работать, не прикасаться к этому ужасу, свалить куда подальше. НО каждый раз меня останавливала моя зарплата и ежемесячные премии(видимо, за вредность:)), о которых тогда я не мог бы мечтать в других компаниях(трезво оценивая ситуацию). Пришлось многое переписывать, производить ежедневный рефакторинг кода и пить кучу кофе просто для того, чтобы сосредоточиться на конкретном куске кода.
Конечно, со временем многое изменилось. Некоторые вещи стали неактуальны, например, одновременно 3 подключенных библиотеки jQuery канули в лету, а главное, на подмогу были наняты еще два программиста. Однако, по прошествии почти года некоторые части кода по-прежнему терпеливо ждут своего преображения...

Теги:  работа 

Поделиться статьей

Оставить комментарий