Comments 93
Все очень верно.
За много лет, имею опыт программирования
и сравниваю с руководством разработкой, в чем опыта нет.
Ну как вам сказать, он есть.
Только я бы поделил этот опыт на 2 части:
1. "Руководство людьми" - у меня получился наихудший результат за всю историю руководства. Много раз предлагали должности начальника ... - отказывался.
2. Постановка задач, написание тех.проектов - поверьте, опыт есть. И, вполне себе, положительный.
Так а почему сейчас то начали не с этого? Не с описания архитектуры, подхода... Вы примкнули не к тем вайбанутым )
Файл agents.md есть? (Гуглится, но очень советую делать свой собственный), файл readme.md с описанием работы приложения? Файл для архитектуры?
Вы ведь сами написали, что имеете опыт написания тех.проектов, но сами его взяли и не применили. Результат более чем закономерен.
Так речь о бабушке из соседнего подъезда. При чем тут архитектура и опыт руководства проектами? Какие еще файлы md? Не пугайте бабушек.
Да откуда идея то, что теперь писать приложения может бабушка? Перестаньте слушать идиотов )
Вот станки ЧПУ появились, и что теперь, никому не надо понимать как они работают? Да щаз.
А вот открываем ленту хабра и там такая новость
https://habr.com/ru/news/977174/
Готов поспорить, что у автора, за плечами, лет 10 опыта разработки игр. Но общий фон создается такой, что "Началось! Теперь и игры можно!".
Пока писал комент, возникла идея. На первом курсе написал простейшую игру с лабиринтом на Паскале. Ну что "вайбигратор" - попробуем.
Автор с ником Crunchfest3 заявил, что работал над проектом около трёх месяцев с помощью Claude Code ... Сначала он создал прототип, применив архитектуру ECS (Entity Component System)...
Ну прямо вот второй абзац намекает, что вайб-кодинг:
Не "по быстрому", а 3 месяца
Не все сразу, а по этапам
Надо понимать про архитектуру и как-то осознанно (ну или по подсказке ИИ) ее выбрать
И, кстати, про игры. Рискую сейчас быть измазанным коричневым от профессиональных геймдевелоперов. Но все же знают трюк, что главный цикл игры загоняется в try catch и если кадр упал, то фиг с ним - следующий отрисуется как надо?
Если в игре, вместо куста рябины появился боярышник, а вон та мохнатая бытовка, возле дома - это, оказывается, собачья будка... То всегда можно объявить, что так и задумывалось.
Но если вы ошибётесь на 10 копеек в зарплатой ведомости, то работяги, с завода, вас морально (а может и физически) затащат в мохнатую бытовку и бросят в куст боярышника, после.
Именно поэтому, я настороженно отношусь к идее бездумного вайбкодинга в реальных "промышленных" приложениях (в настоящее время).
Ну под этим подпишусь. Надеюсь что разрабы ПО самолётов или там ПО для управления АЭС не будут делать таким способом.
Не не будут, а уже делают. Потому что там тоже CEO и под ним мильён менеджеров, у которых KPI. Единственная надежда, что фаззинг большинство багов выявит до того, как оно начнёт управлять реальным железом.
В целом, плюсую каждый ваш комментарий, вайбкодинг ошибочно связывают с каким-то лодырем, который сказал ллм "захуячъ мне щас приложуху" и срубил бабла. Если подойти к вопросу с тщательным планированием и заданием архитектуры проекта - ошибки ллм стремятся к нулю, а скорость разработки растет на порядки. Посыл автора статьи мне в этом смысле тоже не понятен. Раньше, до ллм, по ролику на ютубе мог установить вордпресс любой, кто умеет хотя бы смотреть ютуб или гуглить.
Вайб кодинг - это не про то "как никто сделал всё на гпт", а скорее про то, как умный человек ускорил свою самореализацию и совсем необязательно, чтобы он был программистом, достаточно иметь четкий и правильный план, а не дрочить пол жизни на ньюансы типа "почему 1 плюс 1 не равно 2".
Не пугайте бабушек
...пол бетонный?
Не с описания архитектуры, подхода...
Как только я начну это делать, то теряется весь смысл. Чем больше будет приложение, тем все на более низкий уровень детализации придется спускаться.
Так и до описания параметров функций "довайбимся".
Я же просто хотел себе сделать приложение по лозунгам из Интернета, что теперь можно все сделать ничего не зная. Пока нельзя, к сожалению.
Теперь вы (ещё раз?) доказали себе, что не надо читать газеты по утрам верить рекламе слушать лозунги маркетологов и инфлюенсеров
И кстати, по опыту, опускаться до совсем низких уровней пропала бывает нужно.
Я часто прошу ИИ не писать код, прям принудительно, а сначала описать логику в файле в виде комментариев, пустых функций (условно что на вход, что на выход) или сначала описать и показать мне какие планируются изменения, и только когда проверил на полноту - отправляю делать.
Тоже не 100% гарантии отсутствия багов. Но точно лучше.
Вы же стажёра сначала попросите рассказать как он хочет решать проблем му, и если ок - то уже пусть решает. Или вы не глядя его код принимаете?
На счёт не глядя - смотрите что ИИ хочет делать, а то тут недавно гемини удалило юзеру весь диск D:
Вы же стажёра сначала попросите рассказать как он хочет решать проблем му, и если ок - то уже пусть решает. Или вы не глядя его код принимаете?
Конечно. Тут отличие в том, что когда стажеру говоришь "вот эту красную кнопку сделай зеленой", то он не полезет в обмен данными с платёжным терминалом (хотя разные уникумы попадаются).
Чем больше будет приложение, тем все на более низкий уровень детализации придется спускаться.
Скрытый текст

Классическая ситуация, люди делают выводы о вайбкодинге, даже не попробовав его, либо не понимая его сути. Примерно как оценивать технические возможности формулы 1, не выезжая на трек. Смешно конечно это все читать, заливая на продакшен очередной проект, которыми пользуются бизнесы (уже 4 месяц как, вроде, даже багов не было, а все новые на голову выше предыдущих). Так что пока болтуны негодуют, мы реализуем.
Интересное замечание, только почему то вайб кодинг не способен нормально сделать алгоритмы уровня джун+
Был у меня опыт, для проекта нужно было написать алгоритм передачи пароля с нулевым разглашением данных. И в этом момен нейронки воротили костыли, путая версии данного алгоритма, путая клиентские и серверные стороны. И пытаясь доказать мне что у них всë четко а код почему то не работает.
Как итог, около двух суток я пытал модели, по итогу забил и за 3 часа по документациям, написал сам
Вайбкодинг - это про эмоции от процесса программирования, а не про программирования без соответствующих знаний (все равно, что кухарке начать управлять страной). LLM это просто инструмент и не более того и если за программирование берется человек без нужных знаний и опыта, результат вполне очевиден.
В точку. Как и с фразой про "кухарку и государство", которая в оригинале звучит так:
"Мы знаем, что любой чернорабочий и любая кухарка не способны сейчас же вступить в управление государством... Мы требуем, чтобы обучение делу государственного управления велось сознательными рабочими и солдатами и чтобы начато было оно немедленно "
Т.е. чтобы управлять государством надо сначала долго учиться государственному управлению, а потом приобретать опыт.
Просто сейчас такой информационный фон вокруг вайбкодинга, что складывается ощущение: "Да там делать ничего не надо, только сиди себе и командуй, а он сам за тебя все сделает.".
На счет эмоций - они сначала прям "вау". Но в какой-то момент начинаешь понимать, что это что-то сродни "автокомплиту" (очень утрировано). Просто обычный инструмент. И проблем он подкидывает изрядно.
Ничего нового. Различные ноу-код инструменты предлагаются годами. Я уж молчу про обфускаторы sql, где, не смотря на обещания, приходится знать и sql и псевдоязык очередной его убийцы.
Даже в таком виде вы понимаете эту фразу неправильно. Какому государственному управлению могут научить рабочие и солдаты? Тут ключевое слово "проверенные", и речь идёт всего лишь о назначении управленцев, исходя из политической лояльности.
Вейкбординг сейчас - это быть бесплатным бета-тестером для копроратов. Ну и еще обучающей моделью. Пока дают бесплатный сыр - его можно пользовать. Только Вас заставят платить по гамбургскому счету - вам потребуется оптимизировать процесс. И тут придется оптимизировать запросы и цепочки обработки запросов/генерации, подбирать модели по цене/качеству.
Кстати, многие кто сокращают на волне AI демпинга, потом, когда придется платить реальную цену, уже будут выбирать - кремниевая нейросеть или белковая обойдется дешевле и в каких задачах.
НО сейчас учиться вейкбордингу, возможно, и не стоит. Потому что всё слишком динамично меняется. Но держать руку на пульсе точно стоит. С другой стороны всегда можно перейти от творцов в пользователи и пользоваться готовым сервисом и настроенными генераторами.
Поэтому меньше болтать надо сейчас, а пилить проекты, пока это дешево или даже бесплатно.
Заработал больше 10к$ за декабрь вайбкодингом. Буду рад продолжать бета-тестером для корпоратов, только платить продолжайте. А вы продолжайте называть все это игрушками и не заниматься этом! Не учитесь!!! Пожалуйста!!!
Как же удивительны все эти рассуждения. И не надоедает же. Подлодка джавовая уже больше года вещает взахлёб аи аи аи...
Чтобы понять инструмент посмотрим под капот. Ембеддинги после многоголовой фокусировки тупо генерируют следующее слово. Это же просто экстраполяция в гиперпространстве. Что мы про нее знаем? Чем точнее опорные точки, тем точнее результат.
Поэтому надо тупо: очень точно и очень подробно в терминах выбранного стека технологий дать ТЗ со всеми ожиданиями и ограничениями. И будет шанс за одну-две итерации получить нужное решение. Причем вторая это не продолжение чата а рестарт с уточнениями. Помним про экстраполяцию, экстраполяция экстраполяции до добра не доведет. В другом чате на этот код строим тесты, в третьем просим ревью. Это уже совсем не вайб, а реально работа примерно как у тимлида.
Наступает момент когда запросы таковы, что тесты будут сходиться с генерацией а в ревью нет того с чем можно однозначно согласиться. Можно считать, что наконец-то пошла польза, все что до этого момента - бирюльки, игрушки, вайб, короче трата времени. Итак, получилась разновидность программирования. Всего лишь. На простых задачах буст по времени будет. На сложных, без декомпозиции будет ад. Ну или если угодно вайб.
Слабовато, видимо, Вы изучили текущие возможности разработки с нейронкой. Сразу стало понятно когда об этом заговорили, что собрались тестировать в другом чате.
А вот как только логика разработки поднимается на прикладной уровень (или не дай бог уровень "денег"), то количество ошибок и сложность их поиска\исправления стремиться в бесконечность.
у вас есть чат и логи работы с ним. Вы могли их просмотреть и поискать в какой момент возникла ошибка. Вы их игнорировали? Cursor вообще хранит историю чата между запусками.
А еще есть git, в котором можно просмотреть историю изменений и найти комит в котором произошла ошибка. Вы его не добавляли в проект?
Нет, колонка там была (только пустая). Он действительно не тронул указанное окно.Заметил я это уже на экзамене.
А было ли тестирование проекта?
Выглядит так, как будто это целиком и полностью ваш фейл, который вы решили спихнуть на LLM. Ок, но зачем писать статью об этом, обзываясь обидными словами?
Выглядит так, как будто это целиком и полностью ваш фейл, который вы решили спихнуть на LLM
Вайбкодеры: просто следуй вайбу, просто напиши что хочешь получить, больше не нужно учить эти ваши ЯВУ и алгосики, лучший язык программирования - английский
Также вайбкодеры: ну это, у тебя вайб не тот, промпт не тот, модель не та, надо было QWERTY-сервер подключить и ASDFFGH-протокол заимплементить, MONET.md у тебя кривой какой-то, 5 секунд назад вышла новая нейронка SickFuck 4.20 и она рвет все бенчмарки
Хейтеры вайбкодинга: я установил курсор, написал в нем дословно "сделай за меня всю работу" - не получилось, написал "протестируй приложение" - не получилось, написал "исправь ошибки в проекте" - тоже не получилось. Вывод: все нейронки - фигня, вайбкодинг - фигня, крупные ИИ компании - мошенники, продающие воздух и взвинчивающие цены на комплектующие. И еще напишу статью об этом на хабре, причем не буду указывать ни конкретную модель, ни конкретные промпты - и так сойдет.
написал в нем дословно "сделай за меня всю работу"
Но ведь это именно то, что проповедуют свидетели Святого Преподобного Карпатия. Иначе придется признать, что нужно шарить сразу в бизнесе-аналитике, программировании и архитектуре, чтобы получать нормальное ПО, а не фуфло. О чем автор и пишет.
Это всего лишь две крайности людей: одни считают, что нейросеть сделает за них всю работу, другие - что нейросеть не умеет вообще ничего
Хз, шлите в лес, тех кто так говорит. Ну или посмотрите что они делают - наверное ничего сложнее туда листа или крестиков ноликов там нет.
Да, надо прописать правила, паттерны, версии библиотек, логику приложения и много всего ещё. Прикол в том, что сейчас это модно делать просто на русском/английском/... не зная синтаксис. Но не знать подходов и алгоритмов нельзя.
Те кто пытаются делать иначе - получают вполне ожидаемый результат. Ну или делали какие-то совсем детские поделки. Чем сложнее проект, тем сложнее описать все, вплоть до того, что иногда реально быстрее самому, это нормально.
да какую там всю работу, побойтесь аллаха. написал найди использование того и сего в файлах проекта, шесть попыток, час траблшутинга, второй час тыкания носом и выслушивания "вы совершенно правы, просто на половом органе я вращал ваши сентенции, файлы и сигнатуры методов, просто написал как получилось", потом за третий час мы осилили функционал двух кликов мышкой и ввода того что мы ищем в файлах...
смеркалось, шел четвертый час вайбкодинга работы делаемой за 15 минут. наверное нужен рой агентов, иначе поиск в файлах это слишком сложно
О, вот это да! Оказывается любым инструментом нужно учиться пользоваться!? Вот это да, вот это неожиданность!
у вас есть чат и логи работы с ним. Вы могли их просмотреть и поискать в какой момент возникла ошибка.
Какая ошибка? Ошибок нет. Я ровно про это и пишу, что когда ломается не тип данных, а логика приложения, то никакой компилятор вам ошибку не скажет. Все было прекрасно.
А еще есть git, в котором можно просмотреть историю изменений и найти комит в котором произошла ошибка. Вы его не добавляли в проект?
Есть. Какой комит там искать? По метке "Я специально здесь сделал ошибку?"
А было ли тестирование проекта?
Было. Как ручное, так и автоматическое (попросил создать тесты).
Вручную я прошел весь путь использоваения приложения и выявил то, что мне неудобно. Выявил ошибки, потом попросил их исправить. И так несколько итераций.
Причем, специально указывал, что не трогай функционал, который меня полностью устраивает.
Выглядит так, как будто это целиком и полностью ваш фейл, который вы решили спихнуть на LLM.
Не целиком и не полностью. Я всеми силами пытался сделать рабочее приложение. Ровно такое какое мне нужно, с нужным интерфейсом и функционалом. А не "уфф... ну хоть так получилось сгенерировать...".
Ок, но зачем писать статью об этом, обзываясь обидными словами?
Обидные слова относятся не к людям, которые используют ИИ в своей работе. Я сам использую. Они относятся к тем, кто на волне ажиатажа, пытается впарить людям (за деньги или с умыслом) свои курсы и\или способ мышления, что "оно сделает все за вас, расслабьтесь".
Отвечая на ваш комментарий, я внезапно понял главную "филосовскую" проблему LLM - они не боятся (подозреваю, что это передается и фанатичным адептам вайбкодинга).
Если откинуть совсем бестолкового "джуна", то человек, уже с небольшим опытом, крайне осторожно будет относиться к изменениям в структуре базы данных. А LLM - не боится.
Он менял ее структуру как хотел, не думая о переносе или обновлении старых данных. Да, можно было сказать, что давай сделай совместимость с прошлой структурой. Но ведь оно обязательно вылезет в чем-то другом.
Подозреваю, что у вас нет желания полезть внутрь ядра вашей системы и исправлять там что-то "размахивая лопатой". Вы будете делать это очень аккуратно, продумывая каждое действие. А "Он" - нет. Для ИИ - это просто код. Не более.
Какая ошибка? Ошибок нет. Я ровно про это и пишу, что когда ломается не тип данных, а логика приложения, то никакой компилятор вам ошибку не скажет. Все было прекрасно.
когда я хотя бы минимально проверяю за ИИ, то у меня таких проблем нет. Почему вы не стали так делать - не понятно
Есть. Какой комит там искать? По метке "Я специально здесь сделал ошибку?"
вы выше писали, что ии изменил вам данные. Вы не можете найти в git файлы, относящиеся к бд, и отследить историю их изменений? А также у вас перед комитом в git отображается список измененных файлов - список вы тоже не смотрели?
Причем, специально указывал, что не трогай функционал, который меня полностью устраивает.
есть сразу несколько особенностей нейросетей, которые могут влиять на это. Я тоже не нашел способа как "железно" заставить нейросеть соблюдать определенные правила. Даже рекомендуемые cursorrules периодически отваливаются.
Подозреваю, что у вас нет желания полезть внутрь ядра вашей системы и исправлять там что-то "размахивая лопатой". Вы будете делать это очень аккуратно, продумывая каждое действие.
предпочитаю баланс. Например, в моей работе ИИ неплохо экономит время при создании новых экранов для iOS проекта, но при этом упорно не понимает, как работать с "safe area" ("зарезервированные" системой области экрана). Также он неплохо генерит шаблонный код по команде "сделай то-то по аналогии"
Я прекрасно понимаю о чем вы пишите.
У вас мышление (как у меня и многих здесь, присутствующих) "сломано" годами опыта.
При вайб-разработке, вы наверняка говорите (условно): "В этом классе добавь метод который делает... Добавь экран на котором...".
Вы идёте от подсистем\блоков\модулей приложения. Оперируете особенностями языка и архитектуры. В таком подходе вопросов нет.
А вот когда у вас почти готовое приложение и ты ему просто говоришь, что колонку из списка в первом окне убери и сделай такую же во втором (там придется LEFT JOIN в запрос добавить, т.к. второй список строится по другой таблице). Вот тут может быть что угодно. Вплоть до добавления дублирующей колонки во вторую таблицу БД. А то и удаления ее из первой (вместе с данными).
Если идти в своих командах от интерфейса\функциоала, то, что там будет меняться внутри кода\структуры - одному ИИ известно. А количество изменений (при таком подходе) может быть очень большое. Успустишь что-то - 100%.
Неокрепшим умам, пропагандируют "легкость" и "вайб", но за этой легкостью вида: "поменяй ширину поля ввода", может внутри потянуться такое, что разгребать потом можно неделями.
У вас, или ваших знакомых, сейчас есть проблема с составлением поисковых запросов? Уверен, что нет.
Справедливости ради, проблем с составлением запросов нет. Зато есть проблемы, что по однозначно составленному запросу находится всё кроме того, что искал. Проблема не новая, последние лет дцать ухудшается.
Недавно в топ кода моего вайбкодинка попала строчка
timer: NodeJS.Timeout | false = trueОбожаю потом нейросети спрашивать за такой генерированный код)
Можно ли "вайбкодингом" разработать большое и сложное приложение. Да можно.
Только для этого придется разбить структуру приложения на отдельные блоки и описать связь между ними.
И кто же на такое способен...? Ответ: "архитектор ПО", т.е. человек из высшей иерархии IT-специалистов.
Да, тут автор верно подметил. На данный момент, ИИ не способен принимать осознанные архитектурные решения. Если четко не указать нужную структуру программы, требуемые технологические решения, используемые фрейворки, то в итоге можно получить настоящий "винегрет" из кода, который даже может будет работать, но это не точно.
Для себя выработал такой подход:
Держать контекст выполнения запроса настолько маленьким, насколько это возможно. Если нужно что-то исправить, то делать это в отдельном запросе, потому что пару раз попросите исправить ошибку и всё - контект размоется и ИИ потеряет нить рассуждения.
В кодовой базе иметь некий Markdown файл, где бы хранилось описание программы, текущее состояние разработки, какая часть функционала реализована, а какая нет, используемые технологии, ссылки на документацию (например в отдельных Markdown файлах), описание важных частей кода и т.д. В начале можно попросить ИИ создать такой файл и потом обновлять его. Это позволит ИИ оставаться сфокусированным на задаче и не терять нить рассуждений между запросами.
Ну и всегда иметь перед глазами написанный код, чтобы понять когда ИИ пошел не туда куда надо и оперативно исправить ситуацию.
с подходом все ок, а с выводом по архитектуре странно звучит. Если вы опишите нужный функционал приложения, ваш подход к коду, сообщите, что код придется писать самой нейронке, она прекрасно распланирует и архитектуру подберет. Я вот при разработке веб приложений на DDD остановился и сразу все как по маслу пошло. Не надо стесняться спрашивать саму нейронку, на чём ей легче работать. Надо плясать от этого.
У меня родной Русский. Могу писать на немецком и Английском. Пробовал писать по испански. Меня не особо понимают. Слишколм много ошибок и не так быстро, как я ожидал.
Условый вайбкодинг тоже требует определённых навыков. Управление контекстом, установка и использование MCP, разные роли для разных агентов, в код всё же нужно поглядывать, навыки применения TDD.
Сам люблю почитать код, но всё чаще замечаю, что вычитавыаю внимательно лишь изменения в ключевых частях, а с остальным просто соглашаюсь и запускаю тест. Для продуктовых экспериментов этого достаточно, а до красивого продового состояния есть кому довести.
О чем статья? Что ИИ пока ещё не может вам написать Ютуб? С этим даже "вайбанутые" (к которым я себя причисляю) соглашаются. О том, что писать программы с помощью ИИ не получится на данный момент человеку без минимальной компетенции в IT? - с этим тоже никто не спорит.
Но вот про это хочу:
Если вы понимаете как разрабатывать приложения, то с ним или без него - вы приложение сделаете.
Не верно. Вот пример - Про ИИ, который «ничего не умеет»
Если кому лень открывать статью, то кратко: задача для анонимного веб-чата написать блокировщик собеседников. Код сюда же привожу:
Скрытый текст
// ==UserScript==
// @name Chatroulett WebRTC Blocker
// @namespace http://tampermonkey.net/
// @version 1.2
// @description Мгновенная блокировка нежелательных WebRTC соединений для chatroulett.ru
// @author Your Name
// @match https://chatroulett.ru/*
// @grant none
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
// Инициализация черного списка
const STORAGE_KEY = 'webrtc_blacklist';
const RECENT_IPS_KEY = 'webrtc_recent_ips';
// Функция для получения актуального черного списка
const getBlacklist = () => JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]');
// Разделенные списки исключений
const EXCLUDED_DOMAINS = [
'chatroulett.ru',
'api.chatroulett.ru',
'webrtc.chatroulett.ru'
];
const EXCLUDED_IP_RANGES = [
'0.0.0.0/8', // Текущая сеть
'10.0.0.0/8', // Частная сеть
'100.64.0.0/10', // CGNAT
'127.0.0.0/8', // Loopback
'169.254.0.0/16', // Link-local
'172.16.0.0/12', // Частная сеть
'192.0.0.0/24', // Зарезервировано IANA
'192.0.2.0/24', // TEST-NET-1
'192.168.0.0/16', // Частная сеть
'198.18.0.0/15', // Тестовые сети
'198.51.100.0/24', // TEST-NET-2
'203.0.113.0/24', // TEST-NET-3
'224.0.0.0/4', // Multicast
'240.0.0.0/4', // Зарезервировано
'255.255.255.255/32', // Broadcast
'7.0.0.0/8', // Министерство обороны США
'26.0.0.0/8', // Министерство обороны США
'28.0.0.0/8', // Министерство обороны США
'14.0.0.0/8', // Китай (публичная сеть, но часто используется для NAT)
// подсеть хостинга видеочата
'93.189.228.0/22'
];
// Функция для преобразования IP в число
const ipToNumber = (ip) => {
const parts = ip.split('.');
if (parts.length !== 4) return 0;
let result = 0;
for (let i = 0; i < 4; i++) {
const part = parseInt(parts[i], 10);
if (isNaN(part) || part < 0 || part > 255) return 0;
result += part * Math.pow(256, 3 - i);
}
return result;
};
// Функция проверки диапазона в CIDR нотации
const isIPInRangeCIDR = (ip, cidr) => {
const [network, prefix] = cidr.split('/');
const prefixLength = parseInt(prefix, 10);
const ipNum = ipToNumber(ip);
const networkNum = ipToNumber(network);
const mask = ~((1 << (32 - prefixLength)) - 1) >>> 0;
return (ipNum & mask) === (networkNum & mask);
};
// Улучшенная функция проверки валидности IP
const isValidIP = (ip) => {
if (typeof ip !== 'string' || ip.trim() === '') {
return false;
}
if (/[^0-9a-fA-F.:]/.test(ip)) {
return false;
}
// IPv4
const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
if (ipv4Regex.test(ip)) {
return true;
}
// IPv6 (упрощенная проверка)
const ipv6Regex = /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;
const ipv6ShortRegex = /^((?:[0-9a-fA-F]{1,4}(?::[0-9a-fA-F]{1,4})*)?)::((?:[0-9a-fA-F]{1,4}(?::[0-9a-fA-F]{1,4})*)?)$/;
if (ipv6Regex.test(ip) || ipv6ShortRegex.test(ip)) {
return true;
}
return false;
};
// Улучшенная функция проверки исключений
const isExcluded = (value) => {
// Проверка специальных адресов
if (value === '0.0.0.0' ||
value === '::' ||
value === '0000:0000:0000:0000:0000:0000:0000:0000' ||
value === '255.255.255.255' ||
value.startsWith('192.0.2.') ||
value.startsWith('198.51.100.') ||
value.startsWith('203.0.113.') ||
value.startsWith('169.254.')
) {
return true;
}
// Проверка доменов
if (!isValidIP(value)) {
return EXCLUDED_DOMAINS.some(domain => value.includes(domain));
}
// Проверка CIDR диапазонов
for (const cidr of EXCLUDED_IP_RANGES) {
if (isIPInRangeCIDR(value, cidr)) {
return true;
}
}
return false;
};
// Функция для сохранения черного списка
const saveBlacklist = (blacklist) => {
localStorage.setItem(STORAGE_KEY, JSON.stringify(blacklist));
};
// Функция для добавления IP в список последних
const addToRecentIPs = (ip) => {
if (!isValidIP(ip) || isExcluded(ip)) {
return;
}
let recentIPs = JSON.parse(localStorage.getItem(RECENT_IPS_KEY) || '[]');
recentIPs = recentIPs.filter(existingIp => existingIp !== ip);
recentIPs.push(ip);
if (recentIPs.length > 10) {
recentIPs = recentIPs.slice(-10);
}
localStorage.setItem(RECENT_IPS_KEY, JSON.stringify(recentIPs));
};
// Функция для принудительной очистки черного списка от исключенных IP
const forceCleanBlacklist = () => {
let blacklist = getBlacklist();
const originalLength = blacklist.length;
const cleanedBlacklist = blacklist.filter(ip => {
if (isExcluded(ip)) {
return false;
}
return isValidIP(ip);
});
if (cleanedBlacklist.length !== originalLength) {
saveBlacklist(cleanedBlacklist);
}
return cleanedBlacklist;
};
// Функция для отображения сообщения
const showMessage = (text, backgroundColor = 'red', textColor = 'white') => {
document.querySelectorAll('.blocker-message').forEach(msg => msg.remove());
const message = document.createElement('div');
message.className = 'blocker-message';
Object.assign(message.style, {
position: 'fixed',
bottom: '20px',
left: '20px',
padding: '15px 25px',
backgroundColor: backgroundColor,
color: textColor,
borderRadius: '5px',
fontSize: '18px',
fontWeight: 'bold',
zIndex: 10000,
boxShadow: '0 4px 8px rgba(0,0,0,0.3)',
transition: 'opacity 0.5s ease-out'
});
message.textContent = text;
document.body.appendChild(message);
setTimeout(() => {
message.style.opacity = '0';
setTimeout(() => {
if (message.parentNode) {
message.parentNode.removeChild(message);
}
}, 500);
}, backgroundColor === 'orange' ? 6000 : 6000);
};
// Функция для извлечения IP из ICE кандидата
const extractIPFromCandidate = (candidate) => {
const regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/;
const match = candidate.match(regex);
return match ? match[0] : null;
};
// Функция для извлечения IPv4 из IPv6 адресов
const extractIPv4FromIPv6 = (ipv6) => {
const ipv4MappedRegex = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/;
const mappedMatch = ipv6.match(ipv4MappedRegex);
if (mappedMatch) return mappedMatch[1];
const ipv4CompatRegex = /^::(\d+\.\d+\.\d+\.\d+)$/;
const compatMatch = ipv6.match(ipv4CompatRegex);
if (compatMatch) return compatMatch[1];
const nat64Regex = /^64:ff9b::(\d+\.\d+\.\d+\.\d+)$/;
const nat64Match = ipv6.match(nat64Regex);
if (nat64Match) return nat64Match[1];
return null;
};
// Функция проверки блокировки IP
const shouldBlockIP = (ip) => {
if (!ip || typeof ip !== 'string') {
return false;
}
// Сначала проверяем исключения
if (isExcluded(ip)) {
return false;
}
const blacklist = getBlacklist();
if (!ip.includes(':')) {
return blacklist.includes(ip);
}
const extractedIPv4 = extractIPv4FromIPv6(ip);
if (extractedIPv4) {
return blacklist.includes(extractedIPv4);
}
return false;
};
// Функция для поиска и клика по кнопке ДАЛЬШЕ
const clickNextButton = () => {
// Основной селектор для кнопки ДАЛЬШЕ на chatroulett.ru
const nextButton = document.querySelector('button.btn.btn-primary.btn-lg.d-block.w-100.fs-2.px-0.py-3.py-lg-5');
if (nextButton) {
// Сначала снимаем disabled если есть
if (nextButton.disabled) {
nextButton.disabled = false;
}
nextButton.click();
return true;
}
// Альтернативные селекторы для кнопки ДАЛЬШЕ
const alternativeSelectors = [
'button[class*="next"]',
'button[class*="primary"]',
'.next-btn',
'[class*="next"]'
];
for (const selector of alternativeSelectors) {
const button = document.querySelector(selector);
if (button) {
if (button.disabled) {
button.disabled = false;
}
button.click();
return true;
}
}
return false;
};
// Наблюдатель за кнопкой ДАЛЬШЕ - снимает disabled если он появляется
const observeNextButton = () => {
const observer = new MutationObserver((mutations) => {
const nextButton = document.querySelector('button.btn.btn-primary.btn-lg.d-block.w-100.fs-2.px-0.py-3.py-lg-5');
if (nextButton && nextButton.disabled) {
nextButton.disabled = false;
}
// Также проверяем альтернативные кнопки
const alternativeButtons = document.querySelectorAll('button[class*="next"], button[class*="primary"]');
alternativeButtons.forEach(button => {
if (button.disabled) {
button.disabled = false;
}
});
});
// Начинаем наблюдение за изменениями атрибутов и поддерева
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['disabled', 'class']
});
return observer;
};
// Функция анализа SDP
const analyzeSDP = (sdp) => {
const foundIPs = new Set();
if (!sdp) return foundIPs;
const ipv4Regex = /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g;
const matches = sdp.match(ipv4Regex);
if (matches) {
matches.forEach(ip => {
if (isValidIP(ip) && !isExcluded(ip)) {
foundIPs.add(ip);
}
});
}
return foundIPs;
};
// Создание кнопки блокировки
const createButton = () => {
const banButton = document.createElement('button');
Object.assign(banButton.style, {
position: 'fixed',
top: '50px',
left: '45px',
width: '120px',
height: '120px',
borderRadius: '50%',
backgroundColor: 'red',
color: 'white',
border: 'none',
cursor: 'pointer',
zIndex: 9999,
fontSize: '12px',
fontWeight: 'bold',
boxShadow: '0 4px 8px rgba(0,0,0,0.3)'
});
banButton.textContent = 'BAN';
banButton.title = 'Заблокировать текущего собеседника';
document.body.appendChild(banButton);
return banButton;
};
// Основная функция инициализации
const init = () => {
console.log('Chatroulett WebRTC Blocker initialized');
// Принудительно очищаем черный список от исключенных IP
forceCleanBlacklist();
const banButton = createButton();
let activeConnections = [];
let nextButtonObserver = null;
// Запускаем наблюдатель за кнопкой ДАЛЬШЕ
nextButtonObserver = observeNextButton();
// Перехват RTCPeerConnection
const OriginalRTCPeerConnection = window.RTCPeerConnection ||
window.webkitRTCPeerConnection ||
window.mozRTCPeerConnection;
if (OriginalRTCPeerConnection) {
const createBlockedError = (ip) => {
const error = new Error(`Connection blocked: IP ${ip} in blacklist`);
error.name = 'BlockedConnectionError';
return error;
};
window.RTCPeerConnection = function(...args) {
const pc = new OriginalRTCPeerConnection(...args);
// Перехват setRemoteDescription
const originalSetRemoteDescription = pc.setRemoteDescription.bind(pc);
pc.setRemoteDescription = function(description) {
if (description && description.sdp) {
const foundIPs = analyzeSDP(description.sdp);
for (const ip of foundIPs) {
if (shouldBlockIP(ip)) {
showMessage('Блокировка: ' + ip, 'orange', 'white');
pc.close();
setTimeout(clickNextButton, 100);
return Promise.reject(createBlockedError(ip));
}
}
}
return originalSetRemoteDescription(description);
};
// Перехват addIceCandidate
const originalAddIceCandidate = pc.addIceCandidate.bind(pc);
pc.addIceCandidate = function(candidate) {
if (candidate && candidate.candidate) {
const ip = extractIPFromCandidate(candidate.candidate);
if (ip && shouldBlockIP(ip)) {
showMessage('Блокировка: ' + ip, 'orange', 'white');
pc.close();
setTimeout(clickNextButton, 100);
return Promise.reject(createBlockedError(ip));
}
}
return originalAddIceCandidate(candidate);
};
// Отслеживание активных соединений
pc.addEventListener('connectionstatechange', () => {
if (['closed', 'disconnected', 'failed'].includes(pc.connectionState)) {
const index = activeConnections.indexOf(pc);
if (index !== -1) activeConnections.splice(index, 1);
}
});
activeConnections.push(pc);
return pc;
};
// Копируем прототип
Object.setPrototypeOf(window.RTCPeerConnection, OriginalRTCPeerConnection);
window.RTCPeerConnection.prototype = OriginalRTCPeerConnection.prototype;
}
// Обработчик клика по кнопке блокировки
banButton.addEventListener('click', () => {
let currentBlacklist = getBlacklist();
let foundIPs = new Set();
let alreadyBlockedIPs = new Set();
let newBlockedIPs = []; // Массив для новых заблокированных IP
// Анализ активных соединений
for (const pc of activeConnections) {
try {
if (pc.remoteDescription && pc.remoteDescription.sdp) {
const sdpIPs = analyzeSDP(pc.remoteDescription.sdp);
sdpIPs.forEach(ip => {
if (shouldBlockIP(ip)) {
alreadyBlockedIPs.add(ip);
} else if (!isExcluded(ip)) {
foundIPs.add(ip);
}
});
}
} catch (e) {
// Игнорируем ошибки анализа
}
}
// Добавление новых IP в черный список
let addedCount = 0;
if (foundIPs.size > 0) {
foundIPs.forEach(ip => {
if (!currentBlacklist.includes(ip)) {
currentBlacklist.push(ip);
newBlockedIPs.push(ip); // Добавляем IP в массив
addedCount++;
addToRecentIPs(ip);
}
});
if (addedCount > 0) {
saveBlacklist(currentBlacklist);
// Показываем IP через запятую
if (newBlockedIPs.length <= 3) {
// Если IP мало, показываем все
showMessage(`Добавлено ${addedCount} IP: ${newBlockedIPs.join(', ')}`, 'green', 'white');
} else {
// Если IP много, показываем количество и первые несколько
showMessage(`Добавлено ${addedCount} IP: ${newBlockedIPs.slice(0, 3).join(', ')}...`, 'green', 'white');
}
// Закрываем все соединения
activeConnections.forEach(pc => pc.close());
activeConnections = [];
}
}
// Обработка уже заблокированных IP
if (alreadyBlockedIPs.size > 0 && addedCount === 0) {
const blockedList = Array.from(alreadyBlockedIPs);
if (blockedList.length <= 3) {
showMessage(`Уже в списке блокировки: ${blockedList.join(', ')}`, 'orange', 'white');
} else {
showMessage(`Уже в списке блокировки: ${blockedList.slice(0, 3).join(', ')}...`, 'orange', 'white');
}
activeConnections.forEach(pc => pc.close());
activeConnections = [];
}
// Переход к следующему собеседнику
clickNextButton();
});
};
// Запуск инициализации
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
setTimeout(init, 1000);
}
})();Я backend-программист, я ничего не знаю про современный JS, а уж тем более про технологию webRTC, я ничего не смыслю в этих ваших IP, сетях, масках, не умею извлекать IP из ICE кандидата - я не имел опыта в разработке с этим (джсоны гоняю). ИИ написал мне этот код и он работает. Более того, пример из статьи - это умышленно подогнанный скрипт именно под озвученный в статье веб-чат, ИИ писал мне это решение немного для другого, но похожего сайта. Более того, с помощью ИИ можно указанный скрипт за полчаса адаптировать для любого подобного веб-видео-чата.
Потратил около 8 часов на это. Теперь вопрос: сколько бы я потратил времени на создание подобного, с учётом того, что я не умею писать на современном JS, ничего не зная про технологию webRTC?
Этим самым, выбивается нижний пласт пирамиды профессионального роста. Откуда возьмется "архитектор" если он не был джуном?
Люди 200 лет назад копали землю палками-копалками, а потом появился ТРАКТОР. Они тоже задавали такой вопрос:
Этим самым, выбивается нижний пласт пирамиды профессионального роста землекопов. Откуда возьмется главный эксперт по работе с мотыгой, если он не копал землю палкой-копалкой?
А они скоро будут больше не нужны. Нравится вам это или нет.
P.S. 1: Предвкушая истерику в стиле "аррря вон там ИИ лишний пробел поставил / не так код написал" сразу скажу - это демонстрация работающего решения от ИИ.
Это пример кода от ИИ для человека, который не знает указанную выше технологию и сам бы подобное не написал без длительного углубленного чтения мануалов, которое бы вылилось в чёрт знает сколько времени.
Если не устраивает чистота кода или алгоритмы - скормите код ИИ и он сделает рефакторинг.
P.S. 2: Сливайте карму дальше, ставьте минусы (как обычно), других же аргументов у вас просто нет и вы это прекрасно понимаете, что эта машина в ближайшие 5-10 лет оставит вас на профессиональной обочине истории.
Не верно. Вот пример
Ваш пример только подтверждает тезисы из статьи. Это не приложение. Это единичный скрипт\функция. С самого начала статьи, я написал, что с такими вещами современные модели справляются превосходно.
Попробуйте сделать приложение с несколькими окнами, вкладками или бекенд с логикой, требующей работы с БД + web.
Без понимания, как оно работает внутри, это приложение (состоящее из нескольких блоков\технологий\фреймворков) очень быстро начнет превращаться в какой-то хаос.
Люди 200 лет назад копали землю палками-копалками, а потом появился ТРАКТОР.
Трактор это инструмент. Без понимания когда надо сажать, какую культуру, в каком месте - его можно очень весело пропить. Толку будет больше.
вы это прекрасно понимаете, что эта машина в ближайшие 5-10 лет оставит вас на профессиональной обочине истории.
Если вы правы, то и вас тоже. Я не зря привел пример с "поиском в Интернете".
Сейчас, пока еще, для успешного вайбкодинга надо обладать некими тайными ("гностическими") знаниями: что (например) в ChatGPT лучше накидать структуру приложения, а потом попросить написать промпты для Claude, а в Grok сделать интерфейс... и .т.д.
Думаю, что через год-два, модели будут делать всё, примерно, одинаково + некоторые отомрут. А уж если они научатся делать реальные приложения по запросам на естественных языках, то чем успешный вайбкодер будет отличаться от слесаря?
"Попробуйте сделать приложение с несколькими окнами, вкладками или бекенд с логикой, требующей работы с БД + web. "
Отлично собираются, работают, аптайм 99.99%, задачи выполняются, деньги зарабатываются. Создал маркетинговую платформу за 4 дня без единой строчки кода и каких-либо пониманий бекенда, в итоге работает бекенд, тг боты, сайт, аналитика, трекинг, миниапы в тг, и это уже наверное пятый проект успешно запущенный, работающий в продакшене. Желаю всем тоже так научиться =) Оставлю комментарий как алтарь для неверующих, чтоб через годок могли прийти и написать, как же я был прав.
Создал маркетинговую платформу за 4 дня без единой строчки кода и каких-либо пониманий
..а на пятый день её взломали, потому что «сделай защиту от CSRF» в промпте не было.
Если весь этот стандартный функционал нельзя было за полчаса мышкой настроить в уже готовом решении без каких-либо нейросетей, то индустрия разработки явно забрела куда-то не туда...
https://corecut.ai - ни строчки кода сам не написал. несколько окон имеется, веб имеется, бизнес-логика имеется.
Откуда вы знаете, что этот код правильно работает?
200 лет и палки копалки -- это вы отожгли, конечно. :-)
я уже четко понял, минусят те, кто в конце статей оставляют ссылку на телеграм. И потом ведут на воронку покупки их курсов. Они не потерпят конкурентов, что их крусы теперь никому не нужны =)
Там в комментариях, по вашей ссылке вам знатно надавали аргументов. Программистов в чистом виде уже давно не так много. А где такие вакансии есть, там 1000 откликов на вакансию и зп ниже рынка. Сейчас большинство разработчиков уровня мидл - синьор это эксперты в какой-то предметной области. Например, разработчики 1С бухучет знают как минимум не хуже бухгалтера. И так во многих областях. Там, где создают коммерческие продукты или в критических для бизнеса местах. То есть деньги платят за определенную ответсвенность и новизну. Конечно, LLM может ускорять процесс, особенно на этапе прототипа. И чем меньше квалификация, тем больше языковые модели помогают. Неудивительно, что больше всего восторгов исходит из этой группы разработчиков. Только какова ценность их прогнозов касаемо всей отрасли?
Разработчики 1С с глубоким знанием бухучета это наоборот архаика. Ну, есть конечно свежая кровь на предприятиях где один человек и жрец и жнец, там выбора нет. А везде где покрупнее будет обычная связка БА+СА+лид+архитектор+разрабы. Элементарно потому что изучение всего сразу требует много лет. Людей, которые совмещают все 5 компетенций на хотя бы мидл - один на многие тысячи. А там ведь ещё девопс, администрирование, да тот же uiux
В целом посыл статьи совпадает с моими ощущениями, но сомневают два момента:
А почему вы не попросили помощника написать е2е тестов?
Следующий тезис не выдерживает критики: "Этим самым, выбивается нижний пласт пирамиды профессионального роста. Откуда возьмется "архитектор" если он не был джуном?" Всего лишь 40 лет назад начинающий программист переводил блок-схемы в перфокарты на фортране или pl/1. Потом поднимался до написания самостоятельных блок-схем. С тех пор "нижний пласт пирамиды профессионального роста" выбили. Возможно, даже дважды. О чём говорить, если современные программисты в массе не умеют паять и не знают, как устроен процессор! /s И тем не менее магия подготовки профессионалов как-то работает. И архитекторы продолжают откуда-то браться.
А почему вы не попросили помощника написать е2е тестов?
Сам пожалел, что не попросил. Кстати, спасибо за подсказку. Верну свое единственное ручное изменение и попробую проверить, найдет ли он ошибку самописными тестами.
На второй тезис попробую ответить так: "скорость и эффективные менеджеры". Теперь подробнее:
Скорость. От паяльников и перфокарт до условного бейсика шли, практически, одни и те же люди. Шли очень плавно. Когда появлялись "чистые программисты", то на старых местах еще работали "перфокаторщики", которые эволюционировали в программистов.
И тут на сцену выходят "эффективные менеджеры": "Выгоним 30% самых неопытных сотрудников и оставим только сеньёров+ИИ", премия и бонус, за скоращение издержек.
А куда податься выпертому джуну? Где опыта набираться?
и не знают, как устроен процессор
А это просто не пересекающиеся множества. Те кто не знают - вполне успешно пишут одни приложения (или их модули). Те, кто знают - другие. Я в работе сталкиваюсь и с теми и с другими.
Первые не лучше вторых, а вторые первых. Это разные задачи. Только вот тех, кто понимает, найти сложнее (и они дороже, как правило).
Возможно, появятся третьи - чистые вайберы. Но тогда они оттянут значительную часть из первой и второй группы.
Посмотрим. Будущее не угадать. Я про "сейчас".
И тут на сцену выходят "эффективные менеджеры": "Выгоним 30% самых неопытных сотрудников и оставим только сеньёров+ИИ"
Ну тут, как обычно: "эффективные менеджеры" оставят своих сотрудников и нанимателей без денег, все остальные только скажут "спасибо". Волноваться, вообще не о чем.
и оставим только сеньёров+ИИ
Ой ли... Наоборот, соблазн выгнать сеньоров ой как велик - это ж какая экономия ФОТ
соблазн выгнать сеньоров
Вот дiда Панаса тоже как-то выгнали...
А почему вы не попросили помощника написать е2е тестов?
См. UPD.
Вчера ко мне подошел бывший аналитик ака архитектор, и сказал про книгу, которую я читаю, по микросервисам, что она пустая и в ней много воды, а на вопрос, ты про DDD до нее читал? он ответил: скорее всего да... Вот и думайте. Архитектор сейчас во многом не специалист, а человек с подвязанным языком...
Молодец - понравилось: "с дизайном стиля "Циклоп".. Вот почему у меня глаза слезятся на работе -)))
А серьезно, я думаю скоро чуть поутихнет вайбанутость, когда придет время разгребать это и осознание того, что это не мой код и я его впервые вижу.
Когда вместо того, чтобы изучать чужое приложение, человек сделает его себе сам. Лично под себя. С перламутровыми кнопками и дизайном стиля "Циклоп"
Ну про приложение пока не слышал, но на днях поставил Arch и ... До сих пор настраиваю виджеты под себя (уже 3-яя неделя).
Магия "ИИ" (правильно БЯМ) пропадает когда понимаешь её фундаментальную суть — статистического попугая на ультрамаксималках, который изображает ответ не имея возможности его понимать (термин широкий, но ничего лучше него нет).
Вы просто неправильно делаете. Тут недавно была статья, как ребята из OpenAI вайбкодят. Там вообще легкотня. Просто надо запускать генерацию в несколько потоков. В итоге у ребят получилась прилага с окошком ввода текста и отображением картинок всего за 28 дней. И на токены у них ушло всего ничего: 45.000$. Думаю, если у них вышло, то и у вас получится, надо только захотеть!
Сегодня прочитал, что новый жпт выкатили и попробовать можно. Раскатал, блин, губу. Чуда не произошло, опять повторилась старая история: вначале оно переводило более‑менее, а потом Остапа понесло, вместо трёх глав он накропал аж восемь, и герой, который в оригинале совершал самопожертвование, в «переводе» вылечился и жил долго и счастливо.
Вы наверное весь текст как есть сунули модели, забив 'контекстное окно до упора' (хватит и 16к токенов у типовых моделек, у топовых до 64к доходит, а то что пишут про миллионы, это симуляция), что даже у топовых моделей вызывает коллапс и повышение галлюцинаций.
Есть попытки переводить по кусочкам, организуя агентами память о фактах, важных для перевода (например пол участников при переводе на русский - важен) плюс предложение модели давать комментарии об языковых особенностях и устоявшихся выражениях, но в готовом виде я этого не видел, хотя ручные тесты получаются неплохими.
которые свЯтились как ошибочные
смешно вышло
Вот это новости! Оказывается, ИИ не волшебная таблетка, а всего лишь офигенный инструмент! Кто бы мог подумать!
Сам пробовал полностью вайбкодить - на чём-то очень маленьком и не сложном делает то что и говорят под тезисом "Вайбкодинг", а начиная с момента когда нужно работать над чем-то побольше начинается "Вайбгазлайтинг", то удалит часть важного кода, то начинает тонну одного и того же генерировать. Легче просто самому изменить. Поэтому я использую ИИ чисто как Ассистента для очень ограниченной и маленькой задачи.
Ну и не забудем про автокомплит (на базе ИИ) - иногда прямо то что нужно я а иногда просто мешается под ногами
про asswipecoding даже комментировать не буду, а вот нащёт перемещения контроля консистентности из базы данных в код это очень плохая идея в большинстве случаев. лучше научиться пользоваться внешними ключами и constraints и тогда база данных будет помогать вам находить ошибки в коде. потому что сегодня вы сказали что у вас студентов с одинаковым именем один, или за компьютер сядет сначала один потом другой, и в случае нормально сконструированной базы вы получите возможность увидеть свою ошибку вместо порчи/потери данных. посмотрите какой-нибудь ORM, они все позволяют задать правила зависимости таблиц друг от друга, это очень помогает в разработке
Забавная статья, но вспомнилось:
- Вы не любите кошек? Вы просто не умеете их готовить
Вспомнил, что напомнила эта статья! Недавнюю статью на Хабре, как люди сами себя весело убеждали, что алготрейдинг не работает :)
Вайбанутым нет покоя