← All posts tagged программирование

janPona

Чем больше я работаю, тем больше понимаю, что проще напедалить все самому. До́льше и дороже выходит всем рассказывать, ка́к сделать, чем сделать это самостоятельно.

Я грёбаный интроверт, я не могу и не умею работать с людьми в команде. Я НЕНАВИЖУ других людей и не верю в их способность к обучению. Мне нужен проект, где я бы всё хуярил один. Там бы я был намного эффективнее и продуктивнее. Заебало всё это.

janPona

Программировал сегодня на руби и на джаве. Практически, и то, и другое делал впервые.

Ruby — то понятно. Такая же хуета, как и JS, только с меньшим количеством скобочек и без фронтэнда.

Java — не так уж сильно отличается от привычного мне TypeScript, во всяком случае, те простейшие вещи, которые на ней довелось делать. Но удручает другое. Казалось бы, язык строжайше типизированный, все дела. Но даже здесь наши доблестные шестиконечные девелоперы умудрились налажать. Набор обязательных параметров передается в метод, выполняющий платёжную транзакцию, не через объект какого-то класса, а через Map<String, Object>, а потом уже нужные параметры вытягиваются в самом методе из этого мапа через get() и кастуются к строке или к целому. Ебать, пиздец, да? Платёжная транзакция, если чо. Причём, мне даже понятно, как они к этому пришли. Сначала было два платёжных шлюза. Создали базовый класс и по наследнику на каждый... скажем так, драйвер конкретного шлюза. Окей. Но потом, когда проект вырос, добавилось ещё пять платёжных шлюзов, а сигнатуры абстрактного метода confirmPayment() стало явно не хватать. Ну они и не стали заморачиваться, добавили параметр metadata — эдакую помойку параметров, в которую можно невозбранно пихать всё, что угодно. Я варюся, капец. Текучая абстракция, как есть, бля буду.

janPona

Так вот, обещал вчера рассказать, за что я люблю TypeScript. За строгую типизацию, которая диктует разработчику мышление проектировщика. Да, это сдерживает несущих тебя коней говнокодинга, но часто ловлю себя на том, что пишу час-два что-то, не тестируя и не запуская, а потом запускаю — и оно (о ужас!) работает! Потому что строгая система типов спасает от говна и случайностей.

janPona

1) Проблема позднего внедрения.

FE dev: Давай заюзаем модный фреймворк Ф. На нём же так просто делать штуки Ш1, Ш2 и Ш3!
Lead: Нет! Он слишком молод. Мы не можем так рисковать. Давайте пилить свой велосипед.

... прошло 1.5 года

Lead: Бля, пора это говно порефакторить. Давай что ли перепишем Ш1, Ш2 и Ш3 на фреймворке Ф?
FE dev: Пиздно. Там столько кода, что хуй его знает, как оно вообще работает. код Ш2 содержит 15000 строк. А от Ш1 вообще зависит сторонний сервис, который нельзя трогать, иначе пиздец. К тому же стили для Ш3 используются ещё и на другом скрине, а в случае рефакторинга, стилей там вообще не будет.

2) Проблема раннего внедрения

FE Dev: Давай заюзаем модный фреймворк Ф. На нём же так просто делать штуки Ш1, Ш2 и Ш3!
Lead: О, ништяк! Давай!

... прошло 1.5 года

Lead: давай обновим фреймворк Ф1 с версии 0.1.1 до версии 9.14.0. Там залатали 10миллионов уязвимостей и сделали API совместимый с Zend Framework, который сейчас использует команда К5.
FE Dev: Пиздно. API фреймворка Ф1 последней версии поменялся. А в наших фичах столько кода, что хуй его знает, как оно вообще работает. Код Ш2 содержит 15000 строк. А от Ш1 вообще зависит сторонний сервис, который нельзя трогать, иначе пиздец. К тому же стили для Ш3 используются ещё и на другом скрине, а в случае апдейта версии, стилей там вообще не будет.

janPona
· Edited

Программисты — унылые говнюки.

Я всю жизнь гордился профессией и верил, что нет ничего интереснее, чем программирование. Действительно — ты создаёшь продукт из ничего, оживляешь чистую мысль. То ли дело, например, тестеры, которые изо дня в день, казалось мне, стоят за рутинным конвейером и выполняют монотонную работу, которая никогда не закончится и никогда ни к чему не приведёт.

Но с годами я понял, как я ошибался. Программисты — такие же несчастные конвейерные рабочие, как и тестеры. Как и уборщики мусора.

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

А мы стоим за конвейером. Пишем код, чтобы выполнить сваливающиеся на нас задачи. И этим "другим людям" вообще не важно, на каком языке, на каких фреймворках реализована их ежедневно воплощаемая мечта. Это всё такие же мелкие и несущественные детали, о которых серьёзные дядьки даже не вспоминают.

Это, кстати, и объясняет, почему у программистов (да и вообще, у инженеров) доходы практически не растут (ну, скажем, не в десятки же раз) — в отличие от бизнесменов.

И объясняет, почему я не просто в жопе, не просто в сраке, я тот созидающий глист, который строит полную сраку вокруг себя и в ней же и живёт. А из сраки мозга не видно.

janPona
· Edited

*дыбр *программирование Две недели отпуска закончились.
Часы сдал, правда не без неприятных сюрпризов, вылезших на проде. Ну а куда без них?

На душе как-то депрессивно из-за мгнозапно навалившегося отвращения к коду, программированию и it отрасли в целом. Вавилон, мегатонны информационного шума, толпа незнакомых фреймворков, чуждых мне предметных областей. Слишком сильно ощутил себя песчинкой на дне мирового океана. Тревожный звонок: пропало желание программировать для себя. Это пройдёт, послезавтра на работу, втянусь. Другим не советую так блюзовать, выше нос!

janPona

Самое прикольное в программировании это то, что новое никогда не заканчивается. Края знаниями не видно и не будет видно. От него можно лишь с большей или меньшей скоростью отставать, но никак не приближаться. Сууууууука

janPona

В пятницу со мной произошло знаменательное. Я впервые написал модуль, покрыв его тестами настолько, что он заработал со старта и вообще не потребовалось ничего фиксить в процессе интеграции. Горжусь собой безумно.

janPona

Короче, решил я запилить проксю для телеги.
Долго извращался с dante, запихнул его в контейнер, но потом понял, что это говно, и мне захотелось авторизации юзеров по таблице в mariadb. Ну вот такой вот я извращенец.

Именно socks прокси, не mtproto.

В итоге пишу щас его руками на Go.

janPona

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

Ну казалось бы, что может быть проще — возьми и отфильтруй по endTime > now.
Но это был только вход в кроличью нору.

У каждого события есть начало и конец.
У системы есть свой часовой пояс (который можно произвольно менять), отличный от часового пояса юзера.
Ну отлично, где тут проблема? Нормальные люди хранят в таких случаях отдельно часовой пояс, отдельно абстрактное время. В виде строки, не важно.

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

startDate = toPseudoUtc(SYS_TZ, beginningOfDay(SYS_TZ, absStartTime))
То есть мы сначала вычисляем начало дня в таймзоне системы, затем (НАБЕРИТЕ ВОЗДУХА!) переводим получившийся таймштамп в такой таймштамп, который будучи сформированным в UTC, давал бы строку абстрактного начала дня. "2018-09-28 00:00:00". Но храним не строку, а именно этот абсолютно фейковый, бесполезный и сбивающий с толка таймштамп!
Но это не всё, часы с минутами же отброшены, поэтому они хранят отдельно минуты с начала дня.
startMinutes = бла бла бла, вычисляем разницу в минутах

C endDate всё ещё интереснее. Они переводят тоже в такой тупорылый таймштамп, но только считают конец дня! То есть, условно таймштамп, который при рендеринге в строку в часовом поясе UTC дал бы "2018-09-28 23:59:59". Но (НАБЕРИТЕ ВОЗДУХА ЕЩЁ БОЛЬШЕ!!!) endMinutes они вычисляют... с НАЧАЛА ДНЯ!

Можно выдыхать.

Это пиздец, блядь.

Ну короче, проебался я полдня с их таймзонами и перевёл на клиенте обе псевдодаты в абсолютные таймштампы, которые можно тупо сравнивать с now(). Но еботни столько, что пиздец просто, нигде ж ни документации, нихуя.

А если бы хранили время в виде строки (или хотя бы хуй уже с ним, не хранили, но просто отдавали бы его клиенту в виде строки, всё равно ж оно абстрактное), то не было бы таких проблем.

janPona

В общем, прошёл собеседование на должность техлида в одну безумно крутую компанию.

Но когда понял, что там придётся ВПАХИВАТЬ, РАБОТАТЬ, а не просиживать штаны, прокрастинировать и заниматься левыми проектами на положении капризного гения-любимчика, то понял кое-что.

Я болен несколькими болезнями сразу, мне предстоит лечиться месяц или около того, и переходить в другой проект, чтобы тут же пойти на затяжной больничный — это непорядочно.

Уж лучше тут, пользуясь добротой моего аутстаффного начальства, вытворять что угодно, чем ощущать чувство вины перед незнакомыми мне людьми, за то, что я такой, какой я есть.