В общем, я уже довольно давно ищу работу, при этом крайне желательно, чтобы она была по фрилансовому контракту, ибо у нас частное предприятие.
Где-то в январе месяце подал я заявку на очередную вакансию. Довольно скоро мне пришёл ответ, давайте, мол, общаться. Напишите-ка нам функцию на PHP и отправьте по электронной почте. Ну, думаю, ладно, странно это как-то. Написал, отправил.
Теперь, говорит HR, напишите ещё одну функцию таким же образом. Ладно, написал, отправил.
А теперь, говорит, будет настоящий кодинг-тест. Ну ладно, сделал кодинг-тест как положено на Гитхабе, отправил.
Да, говорит, всё хорошо, ты прошёл, будет звонок с другим HR'ом. Хорошо, звонок так звонок. Звонок состоял примерно в следующем:
— Привет.
— Привет.
— Сколько денег хочешь?
— Столько-то. За час.
— Хорошо, пока.
Я почти не преувеличиваю.
После этого был разговор с чуваком, который представился моим будущим боссом. Говорили о разном, о PHP, о Laravel, о рефакторинге, о платёжных системах, — в общем, расстались довольные друг другом.
И они замолчали больше чем на месяц.
Потом мне написал ещё один HR, уже третий, который сказал «Ойц! Ты знаешь, у нас тут пертурбации, компании сливаются, тех эйчаров, которые с тобой говорили, уже нету, бо уволились, — в общем, ты ещё заинтересован?» Ну да, говорю, заинтересован.
Окей, говорит, скоро приступаешь.
Ладно, подписал контракт, приступаю.
У вас, говорят, неделя онбординга (если что, неделя — это очень, ну просто оооочень, катастрофически мало!). За эту неделю нужно было написать малепусенькую API-интеграцию. Я справился за два дня, потом остальное время правил коммиты, потому что у них какое-то гиперстранное отношение к коммитам: очень важно, чтобы каждый коммит был осмысленным, потому что они не сжимают все твои коммиты в один перед вливанием в основной код, как это делается у большинства людей (так на моей прошлой работе было, так во многих опенсорс-проектах, я сам всегда так делаю), а вливают все твои коммиты в основной код по одному.
Ладно, фиг с вами, золотые рыбы. Это они назвали онбордингом, хотя никто никому никого не представил (см. ниже), только CTO (техдиректор) рассказал, типа как у них всё устроено, причём всё — это было в основном про то, как писать коммиты и как писать ежедневные планёрки-дейлики (да, здесь они не говорятся словами через рот, а пишутся, причём их формат я тогда вообще не понял, а нормально словами мне его объяснила проект-менеджер потом уже). Если что, формат такой, обязательно три пункта: что ты делал; что ты будешь делать; что тебя блокирует (ну например, нет куда-то доступа или нужна чья-то помощь).
Ладно, пошла вторая неделя. И тут меня рандомно направляют в команду совсем другого чувака, которого я в глаза не видел. Опять же, коммуникации ноль, никто ничего никому не говорит, типа-босс (менеджер) вообще не приходит в Слак, не назначает один-на один или, как это часто называют, приветственный кофе — ну такая встреча, где разговаривают о том о сём, о работе, жизни и всём прочем. Тут — тишина. Вот тебе задача, иди решай.
Задача, чтоб вы понимали, перелицевать с Фигмы (это такая дизайнерская штука, типа Фотошопа для веб-дизайнеров современная) модальное окно в CSS. Я, конечно, никому не говорил, что я незрячий (может, зря, но столько было отказов…). В итоге, побарахтавшись какое-то время, я сказал в открытую, что я не могу гарантировать визуальную привлекательность проекта. На что мне было сказано «А я думал, ты фулл-стек». Я, может, и фулл-стек, но я нанимался на совершенно другую вакансию.
В итоге поговорил я с тем чуваком, с которым интервью проходил, и перевели меня в его команду. Тут задачи… нет, Фигма тоже есть, но он мне сказал не париться, типа главное код напиши нормально.
А теперь для тех, кто понимает:
3000 строк — это маленький файлик. Те, с которыми я работаю, 12000 строк PHP и 20800 строк JavaScript;
Если файл PHP, это не значит, что в нём нет здоровенных кусков JavaScript и HTML, которые выводятся просто echo;
Если файл JavaScript, это не значит, что в нём нет каких-нибудь магических массивов, в которые подставляется какой-то HTML;
Если у вас есть пустой span или div, это не значит, что он пустой, — это значит, что где-то через третьи руки зарыт какой-то вызов, где он чем-то заполняется;
Если у вас есть вызов переменной в PHP, будьте готовы, что эта переменная находится внутри функции, а значением этой переменной тоже является уже анонимная функция строк эдак на восемьсот;
Если у вас есть функция «Перевести сообщение» (да, там типа есть многоязычная поддержка), то в неё нужно зачем-то передавать дополнительные параметры, не имеющие никакого отношения к переводу;
Если вы видите jQuery-код, то на самом деле это не jQuery, а ender.js;
Если что-то обёрнуто в try…catch, то исключение ловится так: …) catch (Exception $e) {}. Как следствие, в браузере ошибок нет даже на локальной машине, в логах ошибок нет, нигде ошибок нет, надо (как-то!) использовать отладчик. А отладчик останавливается на всех исключениях, которых там видимо-невидимо;
Если вам сказали, что нужно изменить какую-то маленькую вещь, будьте готовы, что вы увидите повторяющийся буква в букву код в шестнадцати местах. при этом если вы удалите это всё, то ошибок не будет, но и работать тоже ничего не будет;
Конечный продукт практически недоступен для пользователей скринридеров. Недоступен так, что даже я не везде могу эту доступность нормально приляпать.
При этом, повторюсь, коммуникации нет никакой, парное программирование отсутствует как класс, разговоров в команде нет вообще, ни по работе, ни тем более за жизнь. Вплоть до того, что мне приходилось спрашивать у менеджера, кто такая вот эта дама, а кто вот этот чувак. Вообще-то обычно, повторюсь, команду друг другу представляют, а ещё бывают созвоны если уж не ежедневные, то раз в неделю, минимум в две точно.
И тебе никто не хамит, никто не отказывается отвечать на вопросы, но… ты абсолютно и совершенно один на необитаемом острове, а вопросы можешь задавать телеграммой, телеграф работает.
Документация тоже как бы есть, но это куча путаных страниц в Confluence, на которых никак не описана архитектура проекта. Более или менее документировано новое приложение на Laravel, которое должно стать в итоге основным, но мои задачи не по нему.
Я не против был бы, если бы моя задача состояла в разгребании этого всего и в рефакторинге кода. Но нет, мне нужно просто налепливать заплаты на вот этот ужас.
И один тикет, который я считал суперпростым, мне уже завернули, потому что я что-то не учёл в этом чудовищном бардаке.
И честно, я не знаю, что делать, я в растрёпанных чувствах. С одной стороны это работа, она есть и это хорошо, нам, вероятно, удастся немного финансово выдохнуть. С другой стороны… вся эта обстановка так выматывает, что выходных ждёшь как праздника. С третьей стороны, спроси меня в лоб, что не так, я даже не знаю, как именно ответить, кроме вот этого отсутствия коммуникации в команде. Код лапша — так он много где лапша, увидеть более или менее чистый код штука довольно редкая (и кстати да, теперь я понимаю и полностью прочувствовал ещё один плюс фреймворков — они заставляют писать код так, чтобы его можно было потом поддерживать, ну или делают для этого всё возможное).
В общем… реально не знаю. Уже хотел обратиться за помощью к ойремагии, но даже не знаю, чего толком просить.
Менелион Эленсуле пишет:PHP quick tip: не используйте сериализацию массивов при работе с юникодом
Если вы хотя бы немного программировали на PHP, вы уже знаете, что с поддержкой unicode в этом языке, мягко говоря, далеко не всё гладко. Вот и я в очередной раз наступил на грабли там, где вроде бы должна была быть зелёная травка.
Иногда через форму нужно бывает передать массив строк. Можно, конечно, делать много-много input-полей типа hidden, но капитан Очевидность говорит нам, что это, во-первых, некошерно, во-вторых, просто неудобно, а в-третьих, в некоторых случаях может быть и небезопасно в плане «защиты от (любопытного) дурака».
PHP предоставляет нам неплохую функцию serialize(), которая вроде бы позволяет передавать любые объекты в виде строк, в том числе и через форму.
И передавал я так объекты очень долго, пока не пришлось мне иметь дело с большим массивом элементов, некоторые из которых были текстами в UTF-8 (причём не только по-русски). Вот тут-то и началась засада.
Хотел я вам показать, что бывает, если так сделать, но воспроизвести на тестовом файле не смог. Это-то и пишут другие программеры: когда именно вместо вашего текста отобразится весёлый набор крокозябров из высших значений unicode, никто точно не знает. И то, что я поверх сериализации использовал ещё base64, не меняет картины.
Что же делать?
Помимо сериализации можно использовать старый добрый (ну или новый, но по-любому добрый) JSON, который работает с UTF-8 и только с ней.
Для кодирования объектов в JSON в PHP имеется функция json_encode(), которая и придёт вам на помощь в трудную минуту.
Menelion Elensúle пишет:В тему леди Джавы и нашей обожаемой профессии)
В тему поста Рины про Java вспомнилось мне видео, которое я давненько уже смотрел на Youtube. Говорят, что видеоряд этого дела на самом деле является пародией на рекламу не то среды разработки, не то системы отладки, в общем, чего-то из нашей кухни). И опять-таки: слушаем слова). Французский акцент, кстати, неподражаем — как специалист говорю :-)).
Как ни смешно, впервые воспользовался на практике heredoc-синтаксисом. Знал о нём очень давно (со времён, когда делал первые шаги в изучении PHP), но считал его излишеством.
Menelion Elensúle пишет:Не доверяйте при разработке сторонним сервисам, или сказ о неудачном опыте
Сейчас становится очень модным при web-разработке перекладывать часть задач на сторонние ресурсы. Это может быть хранение файлов, осуществление живого общения (чата) и много чего ещё. Иногда это оправдано (когда речь идёт о больших компаниях), но в большинстве случаев это влечёт за собой большие риски. Сейчас я расскажу об этом на собственном примере. Многие знают, что я люблю работать со звуком. В нашей семье за графику и видео отвечает Ностиэ, а за аудио — я. Соответственно, я долго искал сервис наподобие Youtube, только для аудио: чтобы можно было выложить аудиофайл и в ответ получить код для вставки на сайт. И в итоге я его таки нашёл. Нашёл и очень сильно обрадовался, начав закачивать кучу файликов и ставить кучу плееров в лекции в Истаноре. А в один вовсе не прекрасный момент они не то молча поменяли плеер, не то классический плеер временно ушёл в даун. В общем, студенты не могли прослушать ни единого звука в тех лекциях, где они были. Конечно, в итоге мы восстановили эти плеера, но вопрос по-прежнему остаётся открытым: необходимо сделать что-то, чтобы и звуковые файлы лежали на нашем сервисе. Потому что если упадёт наш сервис, то он это сделает сразу и весь, а не кусочком лекции. И повлиять на его работоспособность я смогу по мере сил, ибо, в конце концов, это я плачу за хостинг. Вывод: не верьте сторонним сервисам.
Menelion Elensúle пишет:И снова про багтрекер: решение таки найдено
Помнится, я недавно писал о том, что очень хотел найти багтрекер для Ойров и Истанора. Поддомен соответствующий у меня был создан. Зайдя в очередной раз туда для того, чтобы посмотреть на, как я думал, раскуроченные останки нескольких багтрекеров, которые я пробовал, обнаружил там вполне себе целый и работающий Mantis, да ещё, как оказалось, последней версии. Раньше я Мантис пробовал, но не понравился он мне из-за отсутствия нормальных уведомлений на электронную почту, а точнее, страшной их, уведомлений, глюкавости. Однако последняя версия выглядит прилично, причём не только по этому параметру. Оказывается, и фишечки, которые мне надо, у неё в большинстве своём есть (возможность сделать приватным не только проект, но и отдельный баг-репорт или даже отдельный комментарий, что бывает ну ооочень надо, чтобы не светить имена файлов и полей базы данных, хотя бы). Кроме того, мне неожиданно понравился их русский перевод. Сначала я плевался от слова «инцидент» (==англ. issue). Но с другой стороны, как это обозвать? Бага, ошибка, проблема? В Trac, где в английском варианте tickets, на русский переведено вообще как «Карточки» (!). Нет уж, пусть лучше будут инциденты. Единственное, что у них немного непривычно реализовано, это тип инцидента: если вы запрашиваете нововведение, то это надо ставить соответствующий приоритет, а отдельного поля «тип инцидента» не существует. Там было ещё уйма всего, но я их повыключал за ненадобностью (например, отдельно платформа, операционка, шаги для воспроизведения, дополнительная информация... зачем оно нам?). В общем, милости прошу на http://bugtracker.oire.org/. Пока регистрация открыта всем. Как только увижу что-нибудь ужасное вроде «ааа, уминя картинка не открываиццо» или что-то подобное, что объясняется вашими настройками, — что ж, придётся давать доступ выборочно.
Вообще я очень люблю багтрекеры. Багтрекер (bugtracker) — это (web-)приложение, предназначенное для внесения и отслеживания ошибок в программах, а также для предложения разных нововведений. Давно ищу что-то подходящее для Ойров+Истанора. Не в том смысле, что всем и каждому дам доступ репортить баги, а в том смысле, что лично мне очень удобно так организовывать свою деятельность: вспомнил что-то — зарепортил тикет. Потом захотелось попрограммить — открыл багтрекер, посмотрел, что у тебя не пофикшено и какие пожелания о нововведениях стоят, — ужаснулся и закрыл нет-нет, да и пофиксил пару багов. Бесплатные решения на PHP+MySql, которые мне довелось видеть, хоть чем-то да не нравятся. А то, что в принципе нравится, на виртуальный хостинг не ставится. Например, Trac, написанный на Питоне и требующий доступа к серверу для своей установки. Кстати, не поленился и поставил-таки виндовую версию с самостоятельным веб-сервером на локальную машину. Хорошая штука, но у меня есть идеи, как её усовершенствовать. Прихожу к тому, что багтрекер надо писать свой. И вот уже лежат конфигурационные файлы, даже sql-файл с дампом базы лежит, но... не могу. Почему-то начинать всё с нуля как-то страшно тяжело. Хотя и хочется. Вот. И что делать — не знаю.
Menelion Elensúle пишет:Под какую музыку лучше пишется код.
Вообще говоря, я обычно пишу код или в тишине, или под тихую музыку (специально выкручиваю громкость в Винампе практически на минимум). Раньше думал, что лучше всего пишется под буддийские/индуистские мантры: поставишь какого-нибудь Рави Шанкара минуток так на сорок — и сидишь кодишь спокойно. Ещё тувинское горловое пение хорошо или какой-нибудь релакс: мозги улетают в астрал, мысля идёт, руки по клавиатуре летают — кайф, в общем, ни с чем не сравнимый. Однако я понял, что так бывает не всегда. Вот если ты сидишь и класс какой-нибудь пишешь, или функцию вылизываешь, или что-то допиливаешь до блеска и красоты неописуемой — вот это да: мантры, горловое пение, тибетские чаши в самый раз. Но если ты работаешь в аврале — тут нужен драйв. Причём не просто драйв, а Драйв с большой буквы. Трек последних дней (по нескольким причинам) — Василий К, «Время пиджаков» в электрической версии. Воо, вот под это только баги фиксить, напильником доравнивать то, что надо доровнять кровь из носу, а также делать за полчаса то, что нормальный кодер пишет за целый рабочий день. Так что, уважаемые братья-сёстры по разуму, выбирайте музыку под текущую задачу: если надо кодить долго, медленно и со вкусом — это релакс, а если настиг аврал — драйв и ничего кроме драйва!
Menelion Elensúle пишет:Новинка в Истаноре: легко меняем номер лекций и курсы, на которых они стоят
Давно мучился тем, что для смены номера лекции в расписании и для того, чтобы поставить её (лекцию) на другой курс, надо было заходить на редактирование. Всегда с некоторым замиранием сердца нажимал "Редактировать": а вдруг что-то не то сделалось с текстом? А в лекциях по МММ вообще "труба": Ностиэ всякий раз приходилось переписывать части, где даются примеры html-кода. Я уже давно носил в голове идею, как это сделать, и вот наконец... оно работает. Теперь у номера каждой лекции есть плюсик и минусик (наподобие нашего, ойровского, ага!), позволяющие увеличить или уменьшить номер лекции на единицу. Кроме того, галочки и прочерки теперь кликабельные (то есть по ним можно щёлкать), и они взаимозаменяются, то есть снять или поставить лекцию на тот или иной курс теперь очень легко. Конечно же, это всё происходит без обновления страницы) Ну и la cerise sur le gâteau (вишенка на пирожном), как говорят французы: теперь при добавлении новой лекции автоматически подставляется номер, следующий за последней присутствующей лекцией.