Обновить
204
Denis Tsyplakov@Semenych

Пользователь

41
Подписчики
Отправить сообщение

Не секрет, что про написание кода AI-агентами в автономном режиме (я буду пользоваться термином vibe coding, хотя он не вполне точен) сейчас прям нам вещают из каждого динамика.

С другой стороны, я довольно много использую AI для написания кода, и мои ощущения - «иногда работает неплохо, но надо проверять и высок риск, что в код пролезет какая-то дичь». Т.е. это сильно расходится с историями из интернета. Я внезапно смог четко сформулировать для себя, почему так и когда это работает, а когда нет.

Есть два типа программистов. Первые усиленно пользуются отладчиком, пишут и запускают 100500 тестов и все равно их код часто сбоит, когда что-то идет не по happy path сценарию. Вторые думают, идут гулять с собакой, возвращаются и пишут в разы меньше кода, который работает намного надежнее. На самом деле я, конечно же, идеализирую, и все мы находимся между типом 1 и типом 2, просто кто-то чуть ближе к одному, а кто-то к другому полюсу.

Но в чем принципиальная разница между этими типами? У типа 1 есть какое-то, часто очень локальное предположение о том, как должен работать код, он действует по принципу monkey see, monkey do. Второй пытается построить в голове модель того модуля, который он реализует, и дальше уже, имея модель, овеществляет ее в коде. Второе, как правило, быстрее и надежнее, но на порядок сложнее и требует глубокого понимания всех вовлеченных в процесс элементов.

При этом в IT есть масса задач, которые решаются первым способом, не сильно подготовленными инженерами. Будем честны, последние лет 15-20 первый подход изрядно доминирует в commodity IT, и этому есть объективные причины. Это накладывает отпечаток на инструментарий, культуру, построение SDLC процессов и т.п. (некоторые менеджеры просто не верят, что есть инженеры, которые без тестов и плясок с бубном могут посмотреть на проблему и сказать «вот так делайте»).

Возвращаясь к vibe coding - AI-агент это чистый тип 1. Модель системы и процессов в ней у него не глубже, чем память у золотой рыбки, потому что он оптимизируется под внешний feedback, а не под внутренние инварианты. Он, конечно, пытается что-то документировать, и ему пытаются писать требования, но все это работает довольно тяжело. Одна из причин в том, что инженер (хороший) не только машина для нажимания кнопок, но и источник множества мельчайших, но критически важных функциональных и нефункциональных требований, многие из которых ни бизнес аналитик, ни product owner прописать не могут (тут я в очередной раз сошлюсь на Polanyi's paradox - https://en.wikipedia.org/wiki/Polanyi%27s_paradox).

Это обстоятельство далеко не всегда имеет смысл и не всегда важно. Если вы делаете сайт для записи в барбершоп и вам надо показать список барберов, потом список слотов и потом сделать кнопку book, то строить глубокую модель системы смысла не имеет. Если вы делаете софт для электронной педали газа в автомобиле, то помимо тестов, хорошо бы точно понимать, как что работает и для чего каждая строчка кода и каждая из переменных. Между этими двумя примерами, разумеется, есть широкое поле для обсуждения.

Возвращаясь к AI-агентам - по идее искусство работы с ними заключается в понимании того, где ваша задача находится относительно этой системы координат, и в выдаче агенту задания нужного размера и нужной сложности. Где-то можно доверить делать большой кусок, где-то не более одного небольшого метода, а где-то вообще надо руками написать код. Неожиданное следствие для меня как динозавра, больше полагающегося на понимание кода, чем на тесты - даже если тесты не важны мне, все равно стоит их завести в какой-то мере для AI-агентов, если я хочу ими пользоваться для ускорения разработки.

Надо только правильно их таргетировать - для каких-то кусков они имеют смысл, а для каких-то просто трата времени.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии1
Картинка с поста в LinkedIn
Картинка с поста в LinkedIn

Попалась на глаза картинка (https://www.linkedin.com/posts/joshua-mason-8a7bab96_ive-been-thinking-about-this-lately-why-activity-742). Интересная идея, я так или иначе кручу её в голове уже не первый месяц. Несколько соображений на этот счёт.

Сама идея мелькает в НФ-литературе уже не первый год. То, что я могу вспомнить сейчас, - это Вернор Виндж, «Глубина в небе». В этой книге люди, чей мозг был искусственно изменён для решения узких задач (в книге так делали очень плохие люди), вырабатывали свой, никому не понятный язык, специфичный задаче.

В теории, если делаю какую-то большую систему с помощью ИИ-агентов будущего, в каком-то 2035 году, - можно предположить, что сначала ИИ-агент разработает доменно-специфический язык для конкретной задачи, конкретной платформы и т.п. Просто один специальный язык для ИИ-агентов не имеет смысла. Раз уж у нас есть «мозг», который может писать много кода, - пусть он делает язык под задачу. В чём смысл иметь всего один язык?

В целом, в каком-то смысле, какие-то «нечеловеческие» языки уже есть - это разного рода P-код, байткод и т.д. Такое промежуточное звено между машинным кодом и языком, на котором пишет программы человек. Они, конечно, создавались для другого, но вот вопрос - а для чего именно должен быть создан ИИ-язык? См. пункт ниже.

Следующее соображение - если вернуться из великолепного (или не очень, если судить по трендам) 2035-го года в год 2026, то один из важнейших факторов успешности кодирования с помощью ИИ-агентов - это способность человека читать сгенерированный код и исправлять накосяченное. Ну вот ни разу не похоже, что тот код, который ИИ генерирует, можно пускать в продакшн без ревью и правок. Оговорюсь - для сколько-нибудь сложных / больших приложений.

Из этого автоматически следуют следующие качества используемого языка:

  1. Легко читаем человеком, простые вещи делаются просто.

  2. Мало или вообще нет неочевидных сайд-эффектов.

  3. Распространённые вещи, такие как работа с БД или JWT-авторизация запросов, делаются при помощи библиотеки / фреймворка, а не «с нуля».

Из этих пунктов мы легко получаем на выходе тройку языков: Java / C# / TypeScript с фреймворками Spring Boot / NestJS / ASP.NET Core.

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

Да, все три не идеальны, но это лучшее, что у нас есть в этой области. Сможет ли ИИ придумать лучше? Точнее - люди для ИИ. В теории - да, но это десятки лет работы. Быстро не получится.

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

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

Подводя итог. В целом, идея специального языка витает в воздухе не первый десяток лет.

  1. Скорее всего, это будут специальные языки под задачу.

  2. Мы пока не там. ИИ-агенты, с одной стороны, заметно ускоряют разработку, но с другой стороны - программирование с помощью ИИ-агентов это гонка на костылях от ямы к яме. Требует очень высокого внимания и навыка со стороны человека.

  3. В текущей ИИ-индустрии всё крутится вокруг обучения, и если нет хорошего датасета для обучения, то результат будет очень грустным. Какие-то опыты по самообучению ведутся, но мы пока не там. Например, Google сделал бота для игры в StarCraft, который обыгрывает большинство противников. Но бот изначально обучался на записях игр реальных людей и делает безумное количество бессмысленных вещей. Где взять датасет для обучения программированию на специальном ИИ-языке - непонятно.

Теги:
Всего голосов 4: ↑1 и ↓30
Комментарии3
Картинка с поста в LinkedIn
Картинка с поста в LinkedIn

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

Сама идея мелькает в НФ-литературе уже не первый год. То, что я могу вспомнить сейчас, - это Вернор Виндж, «Глубина в небе». В этой книге люди, чей мозг был искусственно изменён для решения узких задач (в книге так делали очень плохие люди), вырабатывали свой, никому не понятный язык, специфичный задаче.

В теории, если делаю какую-то большую систему с помощью ИИ-агентов будущего, в каком-то 2035 году, - можно предположить, что сначала ИИ-агент разработает доменно-специфический язык для конкретной задачи, конкретной платформы и т.п. Просто один специальный язык для ИИ-агентов не имеет смысла. Раз уж у нас есть «мозг», который может писать много кода, - пусть он делает язык под задачу. В чём смысл иметь всего один язык?

В целом, в каком-то смысле, какие-то «нечеловеческие» языки уже есть - это разного рода P-код, байткод и т.д. Такое промежуточное звено между машинным кодом и языком, на котором пишет программы человек. Они, конечно, создавались для другого, но вот вопрос - а для чего именно должен быть создан ИИ-язык? См. пункт ниже.

Следующее соображение - если вернуться из великолепного (или не очень, если судить по трендам) 2035-го года в год 2026, то один из важнейших факторов успешности кодирования с помощью ИИ-агентов - это способность человека читать сгенерированный код и исправлять накосяченное. Ну вот ни разу не похоже, что тот код, который ИИ генерирует, можно пускать в продакшн без ревью и правок. Оговорюсь - для сколько-нибудь сложных / больших приложений.

Из этого автоматически следуют следующие качества используемого языка:

  1. Легко читаем человеком, простые вещи делаются просто.

  2. Мало или вообще нет неочевидных сайд-эффектов.

  3. Распространённые вещи, такие как работа с БД или JWT-авторизация запросов, делаются при помощи библиотеки / фреймворка, а не «с нуля».

Из этих пунктов мы легко получаем на выходе тройку языков: Java / C# / TypeScript с фреймворками Spring Boot / NestJS / ASP.NET Core.

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

Да, все три не идеальны, но это лучшее, что у нас есть в этой области. Сможет ли ИИ придумать лучше? Точнее - люди для ИИ. В теории - да, но это десятки лет работы. Быстро не получится.

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

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

Подводя итог. В целом, идея специального языка витает в воздухе не первый десяток лет.

  1. Скорее всего, это будут специальные языки под задачу.

  2. Мы пока не там. ИИ-агенты, с одной стороны, заметно ускоряют разработку, но с другой стороны - программирование с помощью ИИ-агентов это гонка на костылях от ямы к яме. Требует очень высокого внимания и навыка со стороны человека.

  3. В текущей ИИ-индустрии всё крутится вокруг обучения, и если нет хорошего датасета для обучения, то результат будет очень грустным. Какие-то опыты по самообучению ведутся, но мы пока не там. Например, Google сделал бота для игры в StarCraft, который обыгрывает большинство противников. Но бот изначально обучался на записях игр реальных людей и делает безумное количество бессмысленных вещей. Где взять датасет для обучения программированию на специальном ИИ-языке - непонятно.

Теги:
Всего голосов 6: ↑2 и ↓40
Комментарии2

Документация == антибиотики

В свете недавних обсуждений про тесты - пара слов про документацию. Я нашёл очень хорошую метафору: написание документации - это приём антибиотиков. Антибиотики спасли сотни миллионов жизней, может быть, больше миллиарда. Ценность открытия антибиотиков для человечества сложно переоценить.

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

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

«Внезапно» не всегда документация так уж нужна. Предположим, у нас есть стандартное Spring Boot-приложение, сделанное через Spring Initializer, со, скажем, файлом build.gradle. В Gradle видна зависимость от Spring Data JDBC и от PostgreSQL базы, и в корне проекта лежит docker-compose.yaml, который стартует PostgreSQL. В src/main/resources лежит application.properties, где определены стандартные data source properties.

Вопрос - что стоит документировать в такой ситуации? Возможно, ничего. Ну, может быть, одну строку: «тут всё примерно как вы ожидаете от Spring Boot + Gradle + PostgreSQL», и, может быть, стоит на этом остановиться.

Более того, во всех случаях, когда я видел New Developer Onboarding документы на 5+ страниц, - это было признаком того, что у проекта есть проблемы того или иного сорта. Возвращаясь к метафоре с антибиотиками: если человек пьёт антибиотик каждые два месяца - с высокой вероятностью у него есть проблемы со здоровьем, которые непосредственно антибиотиком не лечатся, и надо смотреть на проблему комплексно.

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

Как правило, хорошая причина для написания новых документов - это либо какое-то нестандартное решение, которое команда была вынуждена принять по какой-то причине, и тут причину и само решение стоит задокументировать. Либо это какая-то хитрая внешняя причина - например: как получить API-ключ, почему между вызовами API вдруг стоит Thread.sleep(18_500) или что-то такого же плана.

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

Теги:
Рейтинг0
Комментарии0

Про сингулярность

Есть концепция AI-сингулярности. Конкретно это выглядит так. Человечество изобретает AI, тот начинает совершенствовать себя, становится умнее и так по кругу, пока AI не становится с человеческой точки зрения бесконечно умным, открывает недоступные нам законы физики (возможно, скорее всего), и наступает сингулярность: развитие цивилизации в ее текущем виде заканчивается, и либо мы все бесконечно процветаем, либо страдаем и умираем ((С) «У меня нет рта, но я должен кричать»), либо третья опция — когда мы страдаем, но AI убеждает нас, что это и есть процветание, либо мы вообще ничего (почти) не замечаем — вариант «Матрицы» (тут может оказаться, что сингулярность уже наступила, несколько раз, и мы строим N+1-ю сингулярность в мире N-й сингулярности).

Давайте рассмотрим ключевые моменты.

(1) Машины должны быть в состоянии самостоятельно совершенствовать software и hardware части самих себя. Так, чипы уже десятки лет проектируются при помощи какого-то софта, но тут мы говорим именно о AI, способном проектировать работающие чипы end-to-end (в принципе не обязательно производить - производить могут людишки, железные андроиды будут производить чипы или мясные - не важно). Должен ли это быть прям AGI, способный сочинять поэмы, принимать сложные этические решения и снимать кино, - не обязательно. Это может быть очень узко специализированный искусственный разум, заточенный под конкретные задачи.

(2) Этот искусственный разум должен быть достаточно умен. Т.е. если человечество построит искусственный интеллект, эквивалентный человеку с IQ 100, это будет, безусловно, грандиозная ачивка. AI сможет стоять на кассе в «Пятёрочке», принимать новые законы и заседать в советах директоров крупных компаний. Но вот созданию нового, более производительного железа или нового софта он не поможет, пожалуй, никак. Т.е. есть какой-то пороговый эквивалент IQ (EIQ), который нужен, чтобы сингулярность случилась.

Я думаю, что крупные разработчики чипов уже собрали в своих лабораториях большие команды очень умных людей и AI, и для того, чтобы сингулярность произошла, AI придется соревноваться с лучшими из лучших инженеров. Даже если AI будет по интеллекту как просто хороший инженер, это будет большим преимуществом - можно будет быстро загружать в кремниевый мозг громадные массивы знаний и быстро масштабироваться: «склонируйте мне еще 1000 вот этих крутых цифровых чуваков - подождите 30 минут, пока копируются данные». Это очень круто, и это радикально изменит существующий мир. Но сингулярность это не приблизит.

Т.е. для того, чтобы процесс пошел лавинообразно, AI должен как минимум сравняться с условным Андреем Карпатый, тогда его можно будет размножить на 10 000 клонов и прыгнуть вверх. Т.е. сингулярность наступит не тогда, когда мы получим AGI, а тогда, когда мы сделаем его умнее некоторого порогового значения.

(3) AGI должен быть не супердорогим. Давайте представим, что мы построили AI по интеллекту, равный Эйнштейну, но он занимает площадь 1 квадратный километр, стоит несколько десятков миллиардов баксов и питается собственной атомной станцией. Это все еще очень круто. Но построить 1000 таких AGI у нас не получится быстро. Сколько в мире атомных станций? Около 440 реакторов / энергоблоков на 2026 год.

Что дает нам, скажем, сотню Эйнштейнов по цене суммарного госдолга США - что, конечно, очень круто и рано или поздно действительно приведет нас к сингулярности. Но давайте предположим, что AGI разработал чип, который на 10% быстрее / лучше, чем существующий. Сам разработал - 10% это очень крутой прирост. Как быстро будут заменены чипы на этом самом квадратном километре серверов? И сколько это будет стоить? Т.е. прогресс в такой ситуации, конечно, будет, но будет он совсем не лавинообразным.

Интересный вопрос тут - не является ли наш естесвенный интеллект порогово возможным для существующих физических законов? Вдруг существующий человеческий мозг это тупо лучшее что вселенная может нам дать?

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии7

Эволюций взглядов на образование в IT

  • (доисторические времена) Программисты это просто ремесленники переученные из таксистов (реальная ситуация), нет такой профессии программист - есть скажем физик знающий Паскаль и пишущий программы для своих физических нужд

  • (долгие годы борьбы) Есть профессия и наука называющаяся Computer Science, только профессионалы пишут правильные программы

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

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

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

Лично мне больше всего нравился этап №3, но не то чтобы у меня кто-то спрашивал совета.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Когда-то давно, авто тесты, разного рода сканеры и и такие процедуры как pull request review придумали для того чтобы ускорить процесс разработки в целом и особенно усколрить и упростить процесс выкатывания новых релизов.

Но что-то пошло не так и сейчас можно услышать (вот вчера на звонке например) "Мне надо 1, ну максимум два дня сделать и потестить изменения в коде, но потом надо прогнать набор тестов, просканить сонаром и еще двумя сканерами, потом пройти процесс ревью пулл реквеста, так что это займет где-то две недели"

Где мы свернули не туда?

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии2

Смог сформулировать достаточно давнее наблюдение. Рисование диаграм не всем дается. На самом деле нарисовать четкую и понятную диаграмму не так просто даже для простых случаев "Вот эти два сервиса обмениваются данными через RabbitMQ".

Наиболее распространенные ошибки

  1. Раскрашиваем в цвета и добавляем финтифлюшки там где это не требуется. Да цвет может помочь в понимании, но лишняя раскраска и иконки может сбивать с толку.

  2. Рисуем много лишних деталей. Два сервиса обмениваются сообщениями через RabbitMQ, давайте нарисуем еще VPC, availability zone вокруг этого и еще кучу разных шутк, которые там конечно присутствуют, но к делу не имеют отношения. Каждая диаграмма должна иллюстрировать строго тот аспект для которого она предназначена, что плавно подводит нас к третьему пункту.

  3. Диаграмма это история которую один инженер рассказывает другим инженерам. История рассказывается с определенной целью, она должна донести message. Если это про то как данные идут от пользователя к сервисам через RabbitMQ, то эта история должна четко читаться с диаграммы.

NB: Не спрашивайте почему RabbitMQ а не SQS - так история сложилась.

Второй вариант еще не самое худшее, что может быть, тут по крайней мере пункт 3 - история более или менее присутсутвует.

Всего голосов 3: ↑3 и ↓0+3
Комментарии0

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

Обычно сценарий выглядит так. Давайте мы вместо того чтобы тестировать end-2-end сделаем мок сервиса и относительно него будем разрабатывать и тестировать. Причин делать так может быть много и часто без моков вооще никуда. Например у сервиса относительно которого мы работает в принципе нет тестовой среды и доступен только прод. Или есть, но все работает очень медленно и нестабильно и только под ВПН заказчика и только с фиксированого IP

Беда в том, что у моков есть границы применимости. Инструмент это ограниченный. Скажем мы сохранили ответ от третьестороннего сервиса и сделали тестовый мок с которым мы все и девелопим. Потом идем в прод и обнаруживаем что от сервиса может приходить 5 разных вариантов компоновки стрктур данных ответа, а мы сохранили только одну и только с ней тестировали.

Еще раз это понятная проблема и в общем понятно как с ней бороться. Беда начинается когда команды принимают один замоканный ответ за эталон поведения сервиса.

Короче когда слышу на звонках слово мок у меня глаз начинает дергаться.

Всего голосов 5: ↑5 и ↓0+5
Комментарии1

Недавно заходил пить чай к коллеге IT-шнику из другой компании. Зашла речь о струкртуре рынка труда в IT. Коллега неожиданно в обсуждении сказал "Но ведь 99% всего программирования это сайты для продажи чего-то, а их легко автоматизировать, так что много программистов не нужно ... далее как водится речь пошла о ChatGPT"

Это напомнило мне разговор в начале 2000-х где другой коллега рассказывал мне что Delphi это вообще игрушка, на Delphi никто не пишет и все программы написаны на C++. Аргумент был такой - ну посмотри, вот из того что у тебя установленно на компьютере, все написано на С++. Я к тому времени уже успел посмотреть на внутреннее устройство IT нескольких крупных предприятий и звучало аргумент несколько смешно.

К чему я это - IT оно очень обширное и разнообразное. Но в силу несколько специфической надутости пузыря люди со стороны часто могут видеть наиболее надутую часть и соотвественно ориентироваться именно на нее.

"Плагины к Вордпрессу, вот где деньги! Я уже 2 года в IT все в совершенстве изучил и у меня есть плагин за 10 баксов который даже покупают, это дает мне пассивный доход и скоро я стану миллионером"(С) реальный персонаж.

Всего голосов 15: ↑15 и ↓0+17
Комментарии1

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

Надо разработать класс который запоминает текстовые заметки к точкам на карте. Одна точка - одна заметка. Карта дискретная, 10,000 на 10,000 точек. Заметок всего ожидается несколько дюжин, максимум 100-200 штук.

Класс должен имплементировать следующий интерфейс

public interface MapService {

    void addLabel(int x, int y, String label);

    String fetchLabel(int x, int y);

}

addLabel - сохраняет заметку для точки на карте, перетирая предыдущую если она есть

fetchLabel - возвращает заметку для точки на карте, если заметки нет, возвращает null

Вопрос - какую структуру данных в памяти следует использовать для хранения данных

Уточнение которое надо задать после ответа на первый вопрос. Требования дополнились и теперь надо имплементировать еще один метод

List<String> fetchAllLabelsSorted();

Метод возвращает все заметки какие есть в порядке их близости к центру координат - точке (0,0)

Бонус: В плюс идет если кандидат спросит по какой метрике считать близость к центру.

Всего голосов 3: ↑3 и ↓0+3
Комментарии9

Вопросы к собеседованию (#1)

Вопрос про реляционным БД. Уровень - продвинутый. Однозначно верного ответа на вопрос по ходу дела нет, но интересен ход мысли интервьюируемого.

Дано: трех звенная архитектура - клиент, load balancer, несколько stateless серверов, реляционная БД (пусть будет postgres, но критично)

В БД есть таблицы school и subject

У subject поле school_id может быть null - это значит, что предмет относится ко всем школам ассоциации школ. Если school_id не null значит предмет специфичен только для этой школы.

Надо реализовать ограничение:

Нельзя создавать предмет с именем совпадающим с другим предметом для данной школы или с другим предметом в рамках ассоциации.

Например:

  1. У школы id:42 есть предмет "математика викингов" - нельзя создавать еще один предмет "математика викингов" для этой же школы. Но другие школы такой предмет создавать могут

  2. Есть предмет "геометрия" у которого school_id is null. Т.е. предмет относится ко всем школам. В таком случае нельзя создать еще один предмет "геометрия" ни в ассоциации, ни в одной из школ. Это имя полностью уникально.

Вопрос: Как собственно такое ограничение реализовать. Какие есть возможные варианты.

Бонус: В плюс идет вопрос кандидата - "что делать если у школы есть предмет геометрия и теперь такой предмет надо сделать на уровне ассоциации".

Всего голосов 3: ↑3 и ↓0+3
Комментарии3

Информация

В рейтинге
Не участвует
Откуда
Воронеж, Воронежская обл., Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Архитектор программного обеспечения
Java
Java Spring Framework
PostgreSQL
Docker
Проектирование архитектуры приложений
NoSQL