Pull to refresh

Программирование и ИТ во мгле, но это не точно

Level of difficultyEasy
Reading time14 min
Views31K

(Статья была на редактировании. исправил ошибки и убрал часть мемов, так как особо не несли нагрузку.)

У меня не получилось объяснить этим вашим ГПТ, какую статью я хочу нагенерировать. Пришлось писать самому и придумывать мемы. Поэтому в статье, будет гиперболизация проблем в айти и программировании в частности, передергивания смыслов, набрасывание на вентилятор, утверждения без пруфов и шутки про гладиолус ибо я олд.

Приветствую, Хабравчане!

Немного о себе. Я скромный богобоязненный разработчик на С++/С#. В основном моя работа связана с бэкендом, оптимизацией SQL запросов, разработка архитектур баз данных и сервисов для обеспечения высоких нагрузок. В разработке около 10-ти лет. За это время я видел такое, что вам, людям не программистам, и не снилось. Атакующие сервер пользователи, пылающие сервера за стенкой; Указатели Си и ошибки с ними связанные, разрезающие человека на пополам. Все эти мгновения затеряются во времени, как... байты на 8 тб жестком диске... Пришло время рассказать...

Предлагаю вам погрузиться в чарующий мир, рукожопия и всратости. Вы готовы? Погружаемся!

1. Примеры и обучение в программировании

В наш просвещенный век, с гигабитным подключением в каждый дом. Юниту планеты земля доступны тонны информации о всех возможных достижениях науки, исследованиях, книг и учебных материалов. Конечно же еще и смешные котики:) С развитием ютуба, все доступно в видео и аудио версиях. Немного отвлекся, я о чем? А я о том, что если какой нибудь джун типа меня, захочет войти в айти погрузиться в паттерны и практики хорошего кода, он незамедлительно столкнется с учебными примерами и вам скажу так, есть вещи всратее в этом мире, и примеры одни из них.

Особенно лидируют примеры объясняющие принципы S.O.L.I.D. А давайте создадим зоопарк, и будем наследовать ни в чем невиновного пингвина от слона! А для объяснения интерфейсов мы создадим интерфейс плавать и ходить.

Ещё адовый вариант был найден на ютубе. Автор показывал примеры паттернов на примере создания гамбургеров. Гамбургеров, Карл! Создаем фабрику гамбургеров и понеслась. И знаете, что я об этом думаю. Таки да, это всрато.

Я не понимаю, авторов данных эпосов. Вы думаете, что приходя на работу мы тут гамбургеры с пингвинами наследуем и строим иерархии млекопитающих? Почему нельзя дать нормальные жизненные кейсы? К примеру работу с отчетами. Отчеты это вообще отдельная культура программирования. Это и работа с разными форматами хранения и визуализации, это и способы хранить сжимать и пересылать данные. Отчеты бывают в pdf, html, excel, word(прости господи) и т.д Переложить кейс вывода и создания отчетов на S.O.L.I.D. было бы идеальным примером.

Примеры с реализацией бизнес процессов клиент->заказ->оплата->выдача. Примеры связанные с очередями, пересылкой сообщений и т.д

Но нет, у нас пингвины и гамбургеры.

Современное обучение программированию, очень сильно упрощено. Главная цель изучить синтаксис, не изучить фундаментальные концепции, на которых базируются языки программирования. Что есть несколько уровней кэша, для чего нужны, для чего придуманы и как используются. Что такое память, что это не какая-то неведомая зверушка, которая якобы, что-то выделяет. Нет это вообще не так. На уровне ниже, это просто большой кусок, а в некоторых архитектурах, память может быть разделена на несколько независимых кусков со всеми вытекающими. Неважен язык, new или malloc. Это всего лишь абстракция, а под ней тонны кода, оперирующие и дающие возможность разработчику в среднем по больнице, особо не думать, как оно устроено и насколько быстро работает.

Если копнуть в глубь веков, мы можем отыскать архитектуры с машинным словом в 7 бит.

Теории в программировании для изучения полно. Это и сети, ОС, алгоритмы, архитектура компьютера, базы данных, распределенные транзакции и ещё куча всего. Синтаксис это лишь верхушка айсберга, небольшая возвышенность по сравнению с глубинной теорией. Без которой можно в принципе успешно программировать Пример python и JavaScript.

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

2. Удобство софта и сайтов

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

Бесит эта непродуманность и явное забивание на удобство со сторонны пользователя. Заходишь на сайт всплывает помощник, на мобилке тыкаешь закрыть окно, оно раскрывается ещё больше. Заходишь в онлайн банк, и тебе сразу экран рекламы, а так как ты на автомате уже тыкнул пальцем она загружается, а закрытие в левом верхнем углу. Ох как бесит же. Всплывающие уведомления когда я нахожусь в приложении, не надо так делать, если мне интересно просто увеличте количество цифр на звоночке и всё, если мне интересно я сам зайду и посмотрю. Но не нужно мне пихать лишнюю не нужную мне и 99% пользователям информацию.

Здесь должна была быть картинка пользователя заходящего на сайт и отбивющегося от роя летающих членов:)

То кнопки на пол экрана, то маленькие и при нажатии происходит всё, что угодно но не как не закрытие всплывающего окна.

Покупаешь смартфон с большим экраном, фронтендеры просто адаптируют свои свистелки, что бы их больше влезало на экран.

В мире написано 100500 книг по юзер френдли дизайну сайтов. Проводятся конференции, многочасовые доклады. Но нет, наши ребята кладут свой никому не нужный и раздражающий функционал, на каждый экран мобильного телефона съедая от экрана драгоценные пиксели.

Что же ребята с вами не так?

Назад к основам? Сорь вот правильный Джоэль.

Если вы читали Джоэля Спольски, он не об этом говорил.

Несколько коротких историй:

1. История о Яндексе

Вы думаете, что всратее уже не сделать? Теперь и вы не угадали и даже не рядом. Все возможно:)

Мою жену не устраивает делать покупки на своём 15.6 ноутбуке с ryzen 5. На моём рабочем ПК с монитором 32 дюйма это и правда делать удобно. По многочисленным ее просьбам, что бы при открытии новой вкладки загружался по умолчанию поиск яндекс, стал искать расширения к хрому. Окей думаю я. У меня как у С# разработчика нет предубеждений в интернет поисковике:). Мне как C# разработчику хватает одного сайта. Скачал расширение: Поиск и стартовая — Яндекс, установил. Теперь при открытии новой вкладки по умолчанию загружается поисковик Яндекс. Что может пойти не так? Опережаю событие, всё. Я выключаю на ночь пк. Утром при загрузке хрома, я вижу одну отрытую вкладку яндкса, все мои 93 открытые вкладки не сохранились.

Хорошо, что хром способен восстановить недавно закрытые вкладки. Есть вкладки, которые висят неделями или месяцами и ждут своего часа когда я их посмотрю.Так вот вернемся к нашим разработчикам из яндекса.

Эти ребята по закону разработки 666, применив паттерн чик чик и в прод. Свояли вот такое расширение поделие.

Дорогие вы мои разработчики из яндекса, как такой функционал пришел к вам в голову? Мы живем в одном социокультурном обществе, вы смотрели в дестве теже мультики, фильмы, что и я. Мы пели одни песни в школе. Но что с вами не так? Человечество прошло через миллионы лет эволюции, покорила огонь, атом, космос, засрала планету и мозги. Развитие микроэлектроники позволило автоматизировать тысячи производств и вручить каждому человеку удобное универсальное устройство поиска информации и не только. Что бы, что, создать недо расширение, с неожиданным сайд эффектом?

2. История пдфная, драмматическая

Нечасто у меня возникает потребность объединить несколько сканов в один pdf. Использовать онлайн редакторы, такое себе конечно. Начал искать программу для оффлайн редактирования на ПК. Нашел неплохую программу pdf24.

Претензий к функционалу нет. Ну весит установщик 200 мб, после установки 700 мб, всего лишь установочный образ Windows XP. Удивительно, что не больше:) Комбайн, что тут скажешь.

Первый запуск я мужественно прошел. Тыкая в 100500 кнопок:)

Признаться к такому я был не готов, от слова совсем:)

Но есть раздражающий фактор.

Программа прописывается в авто запуск и висит в трее. После возни со сканами и переводом в pdf. Я решил закрыть программу из трея. Как это было...

Смеркалось, JordanCpp допивал свое вечернее кофе со сгущенкой. Стоял ноябрь, снег как любящая мать накрыла своим белым одеялом, землю. Еще оставались желтые листья приподнявшиеся сквозь белое полотно. Природа передавала спокойствие и умиротворение. Ещё раз, он окинул взглядом вид из окна и быстрым движениями подошел к столу, и сел. Ничего не предвещало неожиданного, загрузив браузер, перешел по нескольким вкладкам и увидел программу в трее. Его раздражала иконка овцы в трее, быстрым порывом руки и касанием пальца по правой кнопке мыши, вызвал меню программы. Он почувствовал свое превосходство и власть, над жалким пиксельным созданием. Ему хотелось быстрей покончить с ним. В этот же миг, появилось меню с вариантом "Закрыть PDF24"? но здесь произошло то, чего он не мог ожидать...

У наблюдательного зрителя сразу возникнет вопрос. Отвечаю.

  • Да, я до сих пор пользуюсь DAEMON Tools Lite, в конце 2023 года:)

Это программа явно считает человека обезьяной, которая нечаянно совершила механические действия с мышкой, напрягла 20 мышц кликнув на трей. Что это за рукожопие, в конце концов. Мне вообще безразлично на PDF24 Creator принтер я до использования программы вообще о нём не знал. Я лишь хочу закрыть программу и всё. Мне не нужны дополнительные диалоги, я хочу что бы софт работал ожидаемо. Спасибо завели.

В копилку добавлю программу msi afterburner. При закрытии из трея, спрашивает вы точно хотите закрыть прогу. Но это ладно. Главный цветочек в том, что при загрузке системы, если программа находит новую версию она спрашивает, хотите ли вы обновить версию. Я утвердительно отвечаю, нет. Но думаете разработчики этого поделия озаботились, где соханить моё пожелание. Конечно же, нет. При каждой загрузке Windows, msi afterburner снова спрашивает об обновлении. Как то так.

3. История установки, или Microsoft почему так всрато?

Не могу обойти данную компанию стороной:) Для своего проекта юзаю Visual Studio Community 2022. Кстати о нём я писал в данной статье. И как то в один из дней пришла идея скачать офлайн версию студии. Начал разбираться, что да как. Оказывается, что официального установщика для офлайн установки у майков нет. Хотя казалось бы. Переходим в инструкцию. Некоторые выдкржки:

Ни слова больше.

Ну окей ребята. Идем в инструкцию макета.

Короче там портянка из текста, шеловских скриптов и какой то там матери. Linux style edition. Хотя опять же, казалось бы. Да, да Microsoft ты предлагаешь мне заняться пердолингом. Спасибо, но я пас. История закончилась, тем что я нашел торрент сделанный кулибиным. Где нет привязки к локальному компьютеру. Майки вы движетесь явно не в том направлении. Вас любят, за юзер френдли инструменты, простоту и доступность. Но в 21 веке настолько усложнять процесс скачивания и установки дистра студии, это уже Gentoo Эребор:)

 4. Что там по языкам программирования. Конечно же С++

Что можно сказать про С++. Он есть, каждые три года эволюционирует с учётом обратной совместимости. Становятся ли он проще с каждой версии, ну уж нет. Но программирование на нем, перекладывание идей в код, однозначно становится проще. Уже нет крутых поворотов на тропу диких указателей Си. Голые указатели "заменили" умными. Многословность упразднена auto.

Главная особенность С++ это совместимость с С кодом и библиотеками. Данная фича закрепила позиции С++ на мировом рынке. Не нужно было переписывать проекты с нуля. Прозрачная линковка с огромным количеством сишных библиотек.

Программиста на С++ новые стандарты освободили от гнёта низкоуровневого кода. Теперь, он может творить "почти" как на C#. Что бы это не значило:) И не нужно учить 2000 страниц стандарта языка. Берем вам нужные фичи и используем. Код становится чуть надёжнее и проще. Вангую, что никто не знает полностью язык С++, даже сам создатель языка.

Но, что может пойти не так?

Оказывается со стороны не С++ программистов, много критики. Язык сложен, старый, многословен, нет единого пакетного менеджера, по умолчанию всё не const, мало функциональщины, нет сборщика мусора, Страуструп уже не тот... Ну вы поняли.

А тем временем С++ программисты продолжают писать код.

С++ программисты всегда ругали язык, но программировали. Все, что нас окружает это С/С++ в разных пропорциях. Си код собираемый С++ компилятором, местами С с классами для совместимости. Собственно о чём я, конечно же о Rust. Такое складывается ощущение, что утята дорвались до интернета.

А тем временем С++ программисты продолжают писать код.

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

Особо ретивые ученики, уже отпраздновали кончину С++. Весь код в мире переписан на Rust. Но вот скажите мне, почему в Rust'е осилили безопасность, парсинг 100500 разных видов скобочек, но не осилили впилить исключения и нормальный ООП к которому все привыкли за 40+ лет. Это не безопасно?

Вы серьезно считаете, что ломание всего API с возвратом кодов ошибок и принуждением прокидывания их в каждом методе, избавляет программиста от ошибок? Нет вы не угадали. Это не безопасность, а пердолинг по правилам языка. Нет выбора, отсутствуют удобные механизмы обработки ошибок и это только одна из сторон языка.

Но нельзя сказать, что Rust это всего лишь, попытка. Rust решил одну проблему. Проблему lifetime'ов.

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

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

Но есть и другой вид ошибок, который не может решить не один промышленный язык.

А это:

  1. Логические ошибки.

  2. Численные переполнения.

  3. Переполнение стека.

  4. Проблемы с выравниваниями.

  5. Сложные проблемы многопоточности.

А тем временем С++ программисты продолжают писать код.

Следущим на подходе это Carbon от Google. Что сказать, полно денег, может себе позволить:) Синтаксис как у Rust, ох и любят они эти ваши fn ->[i](чего то там). Даже пугают обратной совместимостью с С++, типа unsafe как в Rust только Cpp{ужасный код состоящий полностью из UB, разврата, похоти, всякого непотребства и крови девственниц}.

Насколько я помню, в начале была Java написанная на С++, так как иначе будет тормозить ещё больше:) Rust это LLVM написанный на.. Сами догадайтесь:)

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

Возможно когда-нибудь С++ станет безопаснее и вберет дельные идеи и наработки из других безопасных языков, в том числе и Rust. Бремя совместимости с С и экзо килотонны кода, накладывает свои ограничения, на скорость и качество эволюции языка.

  1. Что там происходит в современном софте? Всё в говне сэр!

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

А если серьёзно, софт стал сложным, тормозным и не удобным. О windows даже вспоминать уже не хочу. Windows 11 не может нормально работать без ssd диска. Раньше сервера с базами данных читали и записывали информацию на hdd, обрабатывая десятки тысяч запросов, винда, видите ли, не может. Ей нужно передавать гигабайты телеметрии о пользователе. После установки она занимает 40 гб. Вы думаете в комплекте какие то вам нужные программы? Нет. Максимум сможете посмотреть фильм через медиаплеер и запустит калькулятор.

Что бы не быть голословным. Возьмём мой любимый дистрибутив Lubuntu. Использую его лет 10. В основном использую LTS версии. Установлена на 2 ноутбука и 2 ПК и 1 медиацентр.

Версия 16.04 LTS после установки съедает 300 мб RAM и содержит 100500 полезного софта. Редакторы графики, документов. Просмотрщики картинок, браузер, и просто графические утилиты. Последняя актуальна версия 22.04 LTS уже съедает 500 мб ОЗУ. Но между выпусками прошло 6 лет. И за это время системные требования изменились на 200 дополнительных мб и дропнули поддержку 32 битных процессоров.

И тенденция только растет, с каждым годом старые 4, 8, 16 ядерные процессоры устаревают и каждый год маркетологи выдавливают из себя презентацию с графиками производительности в районе 1-2%. Убеждая нас о прорывах и рывках. Представьте, старый четырех ядерник не тянет веб!

Но может мы получили сверхбыстрый софт? Нет, нет и ещё раз нет. Каждая новая версия программы, операционной системы требует больше системных ресурсов.

Веб превратился в чёрную дыру системных ресурсов, она поглощает всё. Загружает процессоры, выжирает ОЗУ, браузер всё время, что-то сохраняет на ssd. Сайты не пишут на js и html, их пишут на фреймворках разной паршивости и прожорливости. И по всему миру процессоры, мобильных устройств, домашних ПК просто греют воздух выполняя миллиарды лишних инструкций.

У современных оконных сред Gnome и Kde, системные требования, равны ААА играм 2007 года. Вот только игры рисуют миллионы треугольников за кадр. А среды только показывают рабочий стол и дают возможность запустить программу с помощью ярлыка. Куда им гигабайты ОЗУ, VRAM и видеокарту с поддержкой OpenGL 3. Что бы нарисовать пару картинок, линий и залить это всё цветом?

Современные системы сборки это кромешный ад сложности. Какие-то сборочные системы написаны на python. Для сборки С++ проекта, требуется целый полноценный интерпретируемый язык, чтобы сгенерировать список файлов и задать ключи компиляции для компилятора. К CMake это тоже относится, тюринг полный язык для конфигов, ну не писец ли это?

Я не ругаю конкретные сборочные системы, они решают фундаментальные проблемы сборки С/С++ проектов. Их нужно решать, но почему настолько сложными подходами, длинной цепочкой зависимостей, кодобазами с сотней тысяч строк кода. Может мы уже перешли грань не просто достаточности, а грань невозврата? Я не спорю с тезисом, что сложные проблемы требуют сложных решений, но может все-таки не настолько это сложные проблемы, что бы плодить настолько сложные инструменты?

А ведь когда то, всё было совсем по другому. Просто оставлю эту картинку здесь!

  1. Что у нас там по микросервисам?

Все мы знаем как на Хабре любят делиться историями по распилу монолита.

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

Как работает монолит, есть БД + пару слейвов. Все запросы работают в едином адресном пространстве. Транзакция либо отработала, либо нет. Других вариантов просто не может быть. В проекте одна моно репа, что позволяет обновлять библиотеки и быть уверенным, что сервис использует именно эту версию библиотеки. Простое развертывание и тестирование. В основном используется реляционная БД + redis для кеширования. Простое профилирование, так как весь запрос как на ладони, требуется только использовать встроенные средства БД. Смотрим топ 10 запросов и оптимизируем. Единая точка логов, что позволяет написать инструмент для визуализации и мониторинга. При росте нагрузки, добавляются новые реплики на чтение. Для отчетников с их многотысячными портянками из SQL, отдельное зеркало и пусть они в ней творят всякое непотребство, содомию и остальную запрещёнку. И все счастливы.

Что у микросервисов? Полный набор болячек. Транзакций нет, теперь появились распределенные штуки. Запрос по сети должен обратиться к другим сервисам, "дождаться" ответа, собрать информацию, валидировать, убедиться, что все сервисы ответили, И только потом после всех этих действий, транзакция считается исполненной, это прям мега упрощение. Просто распилив монолит, на ровном месте приобретается проблема распределенных транзакций, конечно же она решается, за счёт дополнительного кода, дополнительных инструментов, дополнительных лагов сети, синхронизации и т.д Количество микросервисов растет, рассинхронизация по API между сервисами тоже. Как развернуть для тестирования и отладки, тоже непонятно. Как обновлять используемые библиотеки и быть уверенным, что они одной версии, вообще считаю неподъемной задачей, все равно приходится заводить некую монорепу для библиотек и тягать их в микросервисы. Абсолютно все стороны проекта при распиле или переходе на микросервисную архитектуру усложняются. Когнитивная нагрузка возрастает. И срочно ищется >= 1 девопса ибо без него оно всё просто не взлетит.

Есть только один якобы довод. Каждый микросервис становится независимым и небольшим. И да я абсолютно согласен, только, что мешает из легаси монолита, сделать модульный монолит. Объединив преимущества монолита и микросервисов, без микросервисов:)

А самое безумное, что микросервисы не нужны 95% процентам компаний. Я не спорю, что компаниям типа Google, Яндекс, Netflix, VK и ещё с десяток. Необходимы микросервисы каr воздух, иначе все триллионы миллиардов запросов, не осилит нb один мощный сервер из топ 500 производительности. Но для всех остальных это избыточная сложность на ровном месте. Высокая производительность достигается на современном среднем сервере, без терабайт ОЗУ. Простым модульным монолитом. Просто время от времени, требуется обращать внимание на производительность и анализировать замедление. Если вы, к примеру грамотно настроили конфиг того же Postgresql, это половина успеха.

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

  1. И что в итоге?

    Вернуться к основам:)

    У меня нет ответа. Менеджеры и бизнес, хотят быстрого выкатывания фич и самого продукта. Это влияет на прибыли. Капиталистический корабль айти, уже даёт течи и когда нибудь обязательно перевернется, но явно не в ближайшие годы. Поэтому у разработчиков нет никаких шансов, что то изменить. Прибыль будет всегда стоять во главе угла и сметёт всех и вся. Поэтому если вы читаете меня, вы и есть сопротивление:)

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

  2. Ещё минутка информации.

    Ну окей Джо, допустим в твоих словах есть доля правды. Софт во мгле и вообще всё всрато. Но, что ты конкретно сделал для решения данной проблемы? Ты сам пишешь каждый день, свой говнокод на С#, обмазывая классы интерфейсами и делающий new в цикле. Фигли ты ноешь.

    Вы хочете знать, у меня есть ответ. Я конечно же не смогу переписать весь софт, что бы он стал быстр как пуля, работал на любом чайнике. Меня привлекает концепция имея малое, получить большее. Я разрабатываю библиотеку LDL обезжиренный аналого-заменитель библиотеки SDL. Менее ресурсоемкую и поддерживающую не только современное железо, но и старое вплоть по DOS и в будущем есть желание перенести на микроконтроллеры. Главная киллер фича это единое API для всех систем. В прошлом году, даже выступил на конференции С++ 2023. Доклад уже доступен на ютуб.

    Доступна презентация, олды смахнут скупую слезу:)

Вот собственно и всё, о чём я вам хотел рассказть. Спасибо за внимание.

Предвосхищая вопрос, да я читал дневники тестировщика:)

Only registered users can participate in poll. Log in, please.
ИТ во мгле или нет?
66.05% Да463
33.95% Нет238
701 users voted. 94 users abstained.
Tags:
Hubs:
Total votes 140: ↑111 and ↓29+104
Comments305

Articles