13132

Джанго, освобождённый от быдлокода

Коллеги! Выбирайте технологии. Выбирайте так, чтобы потом не жаловаться, что приходится поддерживать за кем-то код «не очень красивого цвета», который ещё и пахнет соответственно.

Поделюсь немного своим опытом. Я веб-разработчик, программист, в основном бэкэнд.

До относительно недавних пор я работал преимущественно с широко известной в России CMS, отличающейся агрессивным маркетингом (вплоть до упоминания жёлтой программы в своём названии), низким порогом вхождения и широкими возможностями нарушения архитектуры. Точно так же, как и многие любители чистого и красивого кода, плакал кровью, глядя на некоторые конструкции, особенно написанные «золотыми сертифицированными партнёрами», осилившими эпический труд «PHP за 24 часа для чайников». Компонент (почти аналог контроллера в традиционных системах), который не содержит логики, а только подключает тот или иной шаблон в зависимости от входного параметра — нормально! А вся логика в шаблоне. Вплоть до обращения к БД. Да, прямыми SQL-запросами, несмотря на то, что система имеет хоть и своеобразный, но всё же ORM. А что? В учебниках для начинающих же действительно есть такие примеры, и возможность обратиться в БД прямо из HTML-файла преподносится как преимущество и неоспоримое достоинство PHP. Но ладно. Сами авторы системы тоже не ангелы. Кто-то про классы жаловался? Так вот, классы — это, по мнению авторов замечательной (без иронии) CMS, всего лишь способ логически объединить несколько функций. Большинство методов класса статические. Но в некоторых случаях нужно создавать объект класса, который будет использован только для вызова одного метода, и нигде и никогда больше. Такое своеобразное видение ООП.

Беда? Однозначно беда. Копаться в таком быдлокоде — приятного мало. Надо было что-то делать. Я изучил альтернативы и остановился на приятном фреймворке Django, с помощью которого теперь и разрабатываю сайты. Возможно, вы не поверите, но проблема чужого кода исчезла. Во-первых, оформление кода. Оно всегда и у всех одинаковое. Синтаксис языка Python предъявляет жёсткие требования. Питоновская идеология также гласит, что для решения задачи должен быть один очевидный способ. В Django эта идея поддерживается. И это помогает, экономит время и нервы. Кто бы ни писал до меня, я заранее знаю, где искать нужный код, даже если проект впервые вижу.

Порог вхождения намного выше. То есть нельзя, просмотрев один 15-минутный видеоурок, сразу начать клепать «визиточки». Нужно иметь некоторую базовую подготовку и потратить время на изучение. Это отсекает случайных людей: средний уровень разработчика на Django намного выше, чем средний уровень широко рекламируемых решений с низким порогом вхождения. А значит, и качество кода выше.

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

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

13131

Алгоритмы лайков не соберут

Автор истории о бесчеловечных методах производства юзверей в промышленных масштабах даже не подозревает, насколько он ошибается.

В подростковом возрасте во мне проснулся интерес к миру IT: учебная программа трудностей в освоении не вызывала, а унять пытливый ум больно уж хотелось. Дома компьютера до 2008 года не было, поэтому на помощь пришёл мой ныне покоящийся с миром SE Z530i. Сначала это были мобильные форумы, потом первые попытки сваять Java-приложение на само́м телефоне (да, умельцы с одного сайта сделали портативную связку «компилятор — преверификатор — упаковщик), потом я вычитал в учебнике по ИКТ про основы HTML-разметки. Первые опыты создания страничек на телефоне были успешнее, чем программирование, и я загорелся желанием двигаться в этом направлении. В школе от нечего делать на этих самых уроках по ИКТ я ваял простые странички, правда, мои старания кроме меня самого тогда никто не оценил. Я всё ждал, когда учительница даст заветное задание из книжки, а я мастерски выполню его и представлю ей. Фигушки. Седьмой, восьмой, девятый класс заканчивался, мы изредка писали простенькие программки на Паскале, при этом не трогая злосчастные учебники. Лишь изредка мы конспектировали материал по алгебре логики, по тому, сколько бит в байте и байт в килобайте. Каждый год я исправно сдавал и брал новые учебники про пресловутому ИКТ, узнавая оттуда про протокол HTTP, про создание десктопных приложений на MS Visual Basic. Руки чесались сделать что-нибудь полезное, но вот даже с появившимся тогда компьютером мне не представлялось возможности достать несчастный Visual Basic. Учебники целый год проводили у меня в столе, иногда я перечитывал их от скуки. В 10 классе я даже, рискнув нарваться на немилость одноклассников, спросил у учительницы, почему мы не по учебникам учимся, а занимаемся ерундой вроде рисования звёздочек в Фотошопе, на что получил невнятный ответ, что программу так построили, что поделать. В 11 классе уроков ИКТ вообще как таковых не было, на них все готовились к ЕГЭ по своим предметам, только лишь мы с одноклассником решали тестовые задания по этому экзамену.

В чём суть столь расплывчатого повествования? Если бы в школах действительно почаще открывали эти самые учебники по ИКТ, в которых пусть даже запросы на кириллице, а реляционные СУБД управляют внезапно реляционными же БД (в компьютерных классах практику не на бумаге выполняют, поэтому опыт и осознание неточностей всегда появляется), то наверняка сайт не пестрил бы историями о бухгалтерах, которые не умеют читать сообщения на экране, или о клиентах техподдержки провайдера, которые не в состоянии найти ярлык запуска сконфигурированного соединения. Так что если на учебнике написано: «Рекомендовано Министерством образования и науки Российской Федерации», может, стоит прислушаться к рекомендации?

13130

Наука понимать буквы

Когда человек, умеющий читать документацию, ставит на ноутбук Линукс — выходит удивительно скучно. Он читает доки, потом запускает установщик, создаёт фиксированные разделы небольшого раздела под рут, /bin, /usr и /var, а оставшиеся сотни гигов отдаёт под /home. Ещё он читал доки на USB и знает, что ток на одну пару разъёмов не может превышать пол-ампера, поэтому дополнительный «хвост» от носимого жёсткого диска нужно втыкать в разъём из другой пары, желательно — подальше. В результате всё работает именно так, как хотелось с самого начала, и никакой байки из этого не получается.

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

13129

Нет предела безобразию

Прочитал тут про страдания одного программиста. Слёзы наворачиваются. Хочу в этот санаторий, там, где функция в 400 строк — предел безобразий. Видимо, у всех болевой порог разный, а у меня болевые рецепторы на заднице стёрлись давно. Итак, что у меня.

Есть программы на Фортране. Язык весёлый. Констант в нём нет, а параметры в программу передаются исключительно по ссылке. То есть вызов call subr(1) на самом деле передаёт в подпрограмму адрес переменной, в которой лежит единица. Значение переменной в подпрограмме можно изменить. Так я узнал, что в любой фортрановской программе есть как минимум четыре единицы (и четыре нуля, кстати), в общем случае не равные между собой. То, что print *, 0 выдаст именно «0», не гарантируется.

Есть программы на Паскале. Все пользовательские типы там именуются по простой схеме: Т1, T2, T3, T4… T55. Что вы, конечно же, есть распечатанный документ, где эти типы подробно описаны, для чего и как, но его потеряли. А переменные экономили, поэтому в разные моменты времени переменная используется для вычисления и хранения совершенно различных по смыслу значений. Поэтому называют их А1, А2, А3. Это не обфускатор. Люди реально так писали.

И, наконец, любимый С++. Реальная программа, которая лет десять назад неплохо продавалась по всему миру. Там есть три функции. Первые две содержат 45 и 35 тысяч строк. Раньше это была одна функция, но Visual C++ отказался компилировать файл больше 65К строк, и автор разбил функцию на две. Третья функция поменьше — 20 тысяч. Практически все 20 тысяч строк запиханы в отрисовку окна. Инициализация программы, парсинг DXF-файла с картой Земли, расчёт всякой астрономической фигни и, собственно, отрисовка.

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

Могу продолжить, но мне уже грустно. А вы над 300 строками плачете…

13128

Непрямое включение

Секретка в кнопке включения — это хорошо и правильно. Вот только «но» тут не одно.

  1. Корпуса современных аппаратов редко рассчитаны на установку дополнительных элементов, а особо «продвинутые» совмещают кнопку включения питания с чем-то ещё, превращая два контакта в многожильный шлейф.

  2. Удобство использования под вопросом. Вживлять магнит для геркона в кольцо или постоянно носить его в кармане, доставая всякий раз? А в случае утери что делать? В общем, не айс.

  3. Кто и за какую мзду будет вшивать эту «секретку» в телефон, особенно с учётом пункта 1? Где гарантия, что местные Левши и Кулибины сделают всё по уму, а не как левая пятка прикажет? Да и стоимость работ (с учётом специфики) вряд ли обрадует, что резко понижает рентабельность.

Но при правильной реализации такая закладка может сослужить добрую службу. Проверено лично.

В результате работы Homo Rukozhopus (я менял себе разбитое стекло) мой телефон приобрёл особенность: кнопку включения нужно было давить очень сильно (лучше — часовой отвёрткой или зубами). После настройки софта для переназначения клавиш и покупки китайского чехла (без чётко пропечатанных кнопок) плюсы стали очевидными:

  • резко упало количество желающих поиграться: «Не включа-ается!»;

  • на блокпостах (при проверке документов там частенько требуют и телефоны) «сломанный» аппарат ни у кого не вызывает вопросов;

  • если вытащить батарею, без опыта включить телефон очень непросто. Точнее, почти невозможно. Пару раз спасало.

Есть, конечно, и минус такого решения: софт таки тянет батарею и занимает память. Но 5 мегабайт при гигабайте ОЗУ погоды не делают, правда? Да и это точно дешевле, чем покупать новую запчасть.

13127

Набор «Спили сам»

Вряд ли кто-то станет рубить дерево молотком. То есть по скудоумию, конечно, может попробовать, но ведь не получится.

Точно так же неудобно рубить дерево обухом топора. Тут вообще почти парадокс. Инструмент-то подходящий. Смотрит такой (ну, назовём его эникеем) на топор, на картинки из мануала — всё ж подходит. Вот дерево, вот инструмент для рубки деревьев, а оно не рубит. Никак. А почему? Да потому, что дерево рубят другой стороной топора.

Мало того, что наш герой рубит деревья молотком или обухом топора, так он ещё и сразу бежит к ближайшему пригорку и с него поднимает крик о том, что вот, дескать, купил молоток, а он не рубит. «Тоже мне кузнец, — говорит герой, — делает молотки, которыми рубить деревья вообще невозможно». Мол, я хотел срубить дерево молотком, а как? Не получается! А про топоры вообще говорить не приходится. И, главное, негодяй такой, совести хватает рассказывать, что топорами хорошо деревья рубить. Да ничего подобного! Купили мы на фирму два топора, я обухом бил-бил по дереву — ничего! Без толку! Лучше бы резиновым фаллоимитатором колотил — больше пользы было бы. Осталось ощущение, будто кузнец лично надо мной надругался.

То ли дело — лобзик из набора «Сделай сам»! Да, долго, да, неудобно, да, ломается постоянно, но ведь работает же! А сломанную пилку я сам заменить могу. В прошлом месяце такую сосну им спилил — закачаешься.

Понаделали, понимаешь, гламурных топоров с блестящими лезвиями, ходят лесорубы, понтуются ими. Нет, чтобы с лобзиками ходили. Да, а кузнец знаете сколько за свои топоры просит? Совести нет совсем! За гламурные блестящие топоры, которыми я не могу ни одного дерева срубить, такие деньжищи!

Я надеюсь, аллегорию все поняли? Разъяснять не нужно, потому что, во-первых, потеряется весь смысл, а во-вторых, тем, кто не понял, разъяснять и не нужно.

13126

Спящий рабочий общаться не хочет

Делаем большой интересный серверный проект. В прошлом месяце начальство внезапно постановило: нужно, чтобы сервер умел вставать на паузу! Ну, и ТЗ, как он это должен делать. В частности, перед уходом на паузу сервер должен успеть обработать и выдать все принятые пакеты. Архитектура многопоточная: сетевой поток, занимающийся как отправкой, так и приёмом пакетов, UI-поток, принимающий и обрабатывающий пользовательские команды, SQLworkers, UtilityWorkers и куча рабочих потоков.

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

Реализовали, отправили тестировщикам. На следующий день пришёл ответ.

Я был сильно озадачен результатом применения паузы под серьёзной нагрузкой. Сперва поток UI рассылает всем приказ встать на паузу, затем сам становится на паузу. NetWorker моментально становится на паузу: он очень быстро всё принимает и отправляет. Воркеры так же быстро становятся на паузу, а вот один из SQLworkers при обработке запросов INSERT/UPDATE [имя очень тяжёлой таблицы] может очень долго ждать ответа от БД. И как только он его получит, он сделает запись в лог об этом, разбудив поток UtilityWorker, потом кидает результат в общий пул сообщений, разбудив пул воркеров, потом этот пакет будит NetWorker. В то же время поток UIworker не пробуждается от запроса в очередь сообщений.

В итоге мы получаем полностью рабочий сервис со спящим потоком UIworker, разбудить который может только пользователь… Который сделать этого не может, ибо спящий UIworker не обрабатывает поступающие команды.

Теперь поток UI никогда не может встать на паузу.

13125

Я узнала маленький секрет

«Секретка» — штука, знакомая многим водителям. Конечно, применять её вместо сигнализации может лишь очень отчаянный человек, но в дополнение — очень эффективно.

А почему же этот приём неведом владельцам смартфонов? Даже простой геркон последовательно с кнопкой разблокировки обескуражит процентов 70 воришек, а это не так уж мало. Ну вот, один секрет — больше не секрет, но можно других напридумывать сколько угодно.

Если бы не одно «но». Гарантийный аппарат установка «секретки» лишит гарантии, а послегарантийные воришек интересуют в меньшей степени.

13124

Загрузка программ и столов

Начинал я свою службу на заводе, работал прогером. Отдел был не очень большой: пять-шесть разрабов, четыре механика и сисадмин. Находились мы все в соседнем здании от основного, но наш Великий и Ленивый Админ решил, что он будет сидеть в головном здании и всех местных юзверей заберёт к себе на обслуживание, а механики пущай бегают по складам. Но со временем он очень обленился и заявил: «Идите все лесом! Я админ и буду следить только за серверами, а мышки и клавы пусть меняют механики!» Так и получилось: бедные механики бегали по складам и по всей территории (а она, я вам скажу, была весьма внушительных размеров), а тётки из головного здания были очень капризные. То у них мышка не так двигается, то ей свет в мониторе не нравится.

Дык вот, так как мы сидели в разных кабинетах, то и телефоны у нас были разные, но механиков никогда не было на месте (трудились, бедные). И тогда все эти разъярённые тётки звонили нам, прогерам, и вечно жаловались, требовали, чтоб именно я пришёл и посмотрел, что у них не так. Порой доходило до абсурда.

— Алло, здравствуйте, а придите к нам, у нас свет не работает.

—  Дык звоните электрикам, я здесь при чём?

— Ну-у-у… Компьютер же тоже не работает! Придите и почините!


— У нас нужно сделать перестановку, придите, передвиньте шкаф и стол.

— Эм, уважаемая, а почему вы звоните мне, а не грузчикам?

— Ну, у вас там много мальчишек работает, а грузчиков всего двое и они устают, бедненькие. Да и вообще! Нам нужно передвинуть стол, а на нем стоит кампутар, так что это ваша работа!


И вот мне надоело каждый раз на зов прийти и поменять картридж объяснять разницу между программистом и эникеем. Когда у меня горели сроки, а телефон разрывался, я поднял трубку, и случился такой диалог:

— Здрасте, у меня мышь не двигается, придите и посмотрите.

— Девушка, звоните механикам, мы программисты.

— У меня же мышка в программе не работает, так что почините.

— Я пишу программы и обслуживаю только те, которые я сам написал. Если же это не моя программа, то я не буду к вам идти, тем более если у вас не работает не программа, а мышь.

— А вам сложно, что ли?

— Девушка! Если у вас болит глаз, вы же не идёте к гинекологу и не говорите ему: «Посмотрите, пожалуйста, вы же врач!», а ждёте окулиста, даже если его нет.

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

13123

Валерьянки за вредность

Помощи помощникам? Да что вы знаете про глюки, что вы знаете про боль и страдания? Кому приходилось поддерживать и разбирать чужой код, меня поймёт. Хотя и не знаю этого наверняка, но всеми библиотеками своей души пытаюсь на это надеяться.

Один класс (имя не отражает сущность — кого это волнует?) и сотня функций. Казалось бы, нормально. Нормально?! Ни хрена это не нормально, когда поля класса расположены случайным образом между функциями. Именование переменных, бизнес-правила? Да ну их в большой сочный болт! Метод, внутри которого переменные t, p, x, а некоторые и глобальные — вот что здесь норма.

Вы думаете, это всё? Да я молился, чтоб этом было «всем». Это творение подключалось к базе Аксесса. Банально через датасеты. Банально? Ну да, слишком банально. Один датагрид, пять таблиц, поэтому что? Правильно: надо пять датасетов! Имена… А что имена? Имя как имя: 50 символов, начинается латиницей, продолжается русским капсом (тысяча блудниц!) и заканчивается цифролатиницей. И их пять. Пять таких датасетов в одной форме. На один датагрид. А знаете, какой запрос в каждом из пяти датасетов? Глаза вытекают: SELECT * FROM [dataTableName];.

Про форматирование кода после предыдущего даже писать как-то мелочно.

Функция. Да-да, именно так: Функция. Особая примета: входной параметр — y, выходной — x. 150 строк. Шта? Ладно. Следующая. 230. Шта-а-а? А дальше скромная ФУНКЦИЯ. 320 строк. Мои глаза невозможно было представить, пока я не увидел следующую (правда, всю закомментированную однострочными комментариями) на 400 строк. Я не знаю, как про это говорить.

Похоже, я должен требовать ящик валерьянки в неделю как расходные материалы.