JavaRush /Java Blog /Random-KO /레벨 38. 레벨 주제에 대한 인터뷰 질문에 대한 답변
lichMax
레벨 40
Санкт-Петербург

레벨 38. 레벨 주제에 대한 인터뷰 질문에 대한 답변

Random-KO 그룹에 게시되었습니다
레벨 38. 레벨-1 주제에 관한 인터뷰 질문에 대한 답변안녕하세요. 다시 말하지만, 이 수준의 질문에는 답이 없는 것 같습니다. 그래서 평소처럼 포스팅을 합니다. 갑자기 누군가가 도움을 줄 것입니다(또는 누군가가 무언가를 추가하거나 더 나은 답변을 제공할 것입니다). 그래서 질문은 다음과 같습니다.
  1. 애자일이란 무엇입니까?
  2. 스크럼이란 무엇입니까?
  3. 어떤 스크럼 역할을 알고 있나요?
  4. 스프린트란 무엇입니까? 자세한 내용을 알려주세요.
  5. QA는 누구인가요?
  6. 제품 소유자는 누구입니까?
  7. 예외 계층 구조 설명
  8. JVM에서 오류가 발생하면 어떻게 해야 합니까?
  9. Java 7의 예외 영역에서 어떤 혁신을 알고 있습니까?
  10. 주석이 필요한 이유는 무엇입니까? 어떻게 사용하나요?
이제 내 대답은 다음과 같습니다.
  1. 애자일(Agile) 은 반복 개발, 요구 사항의 동적 형성 및 다양한 프로필의 전문가로 구성된 자체 조직 작업 그룹 내 상호 작용의 결과로 구현을 보장하는 데 초점을 맞춘 소프트웨어 개발에 대한 일련의 접근 방식입니다. 유연한 개발 방법론, 특히 익스트림 프로그래밍, DSDM, Scrum, FDD와 관련된 여러 기술이 있습니다.

    Agile 방법의 기본 개념:

    • 프로세스와 도구보다 사람과 상호 작용이 더 중요합니다.
    • 포괄적인 문서화보다 제대로 작동하는 제품이 더 중요합니다.
    • 계약 조건에 동의하는 것보다 고객과의 협력이 더 중요합니다.
    • 원래 계획을 고수하는 것보다 변화하려는 의지가 더 중요합니다.

    이 접근 방식의 기본 원칙도 공식화되었습니다.

    • 귀중한 소프트웨어를 중단 없이 조기에 제공함으로써 고객 만족;
    • 개발이 끝난 후에도 요구사항의 변화를 환영합니다(이는 시장에서 제품의 경쟁력을 높일 수 있습니다).
    • 작동하는 소프트웨어를 자주 제공합니다(매월 또는 매주 또는 그보다 더 자주).
    • 프로젝트 전반에 걸쳐 고객과 개발자 간의 긴밀한 일상 커뮤니케이션;
    • 프로젝트는 필요한 작업 조건, 지원 및 신뢰를 제공받는 의욕 있는 개인에 의해 수행됩니다.
    • 권장되는 정보 전송 방법은 개인적인 대화(대면)입니다.
    • 제대로 작동하는 소프트웨어는 발전을 가늠하는 가장 좋은 척도입니다.
    • 스폰서, 개발자 및 사용자는 무기한으로 일정한 속도를 유지해야 합니다.
    • 기술력과 사용자 친화적인 디자인을 향상시키기 위한 지속적인 관심;
    • 단순함 - 불필요한 작업을 하지 않는 기술;
    • 최고의 기술 요구 사항, 아키텍처 및 디자인은 자체 조직된 팀에서 나옵니다.
    • 변화하는 조건에 대한 지속적인 적응.

    개발의 주요 문제는 모든 단계의 참가자 중 누구도 무엇을 해야할지에 대한 완전한 정보를 갖고 있지 않다는 점입니다.

  2. 스크럼은 애자일 개발 기술 중 하나입니다. 개발 프로세스의 품질 관리에 중점을 둡니다. 스크럼의 주요 특징은 개발 프로세스를 명확한 기간(보통 2~6주, "스프린트"라고 함)의 반복으로 나누는 것입니다.

    В начале спринта проводится "планирование спринта" — совещание на 3-4 часа, где обсуждаются основные задачи, которые будут решаться на протяжении спринта. В конце спринта проводится "демо" – демонтрация результатов работы команды за этот спринт.

    Перед самым первым спринтом заказчик (or его представитель) формирует список требований, предъявляемых к будущему продукту. Такие требования называются "user story", а самого заказчика называют "product owner". Также в этом списке заказчик (PO) указывает приоритет для каждой задачи. Сначала будут реализовываться задачи с более высоким приоритетом. Весь список называется "product backlog", or "резерв продукта".

    Кроме product owner, среди участников ещё выделяют scrum-мастера: он проводит все совещания, следит за соблюдением всех принципов скрама, разрешает противоречия и защищает команду от отвлекающих факторов. Обычно в качестве скрам-мастера выступает кто-то из команды.

    На первом совещании в начале спринта каждой задаче, кроме того, что назначается приоритет, даётся ещё приблизительная оценка в "абстрактных человеко-днях", которые ещё называют "story point". Затем команда решает, сколько она успеет выполнить задач за время спринта. Например, заказчик отобрал 7 задач, а команда сможет сделать только 5. Тогда остальные две задачи пойдут на следующий спринт. Если заказчику это не нравится, он может повысить их приоритет, но тогда другие задачи выпадут из спринта. Кроме того, скрам-мастер может разбить некоторые задачи на более мелкие и расставить им различные приоритеты, чтобы заказчик остался доволен.

    Список отобранных задач на спринт называются "sprint backlog", or "резерв спринта". Для лучшей наглядности обычно составляется table, в которой указываются задачи, которые нужно реализовать, которые находятся в процессе реализации, и те которые уже выполнены. Также строится диаграмма "сгорания задач". Она графически показывает, сколько ещё задач осталось выполнить. В идеале график сгорания задач к концу спринта должен опустится до нуля.

    Также в течение спринта каждый день or через день проводятся небольшие совещания внутри команды на 5-15 minutes, где каждый участник команды рассказывает, что сделал за этот день (or эти два дня), что ещё ему предстоит сделать, а также рассказывает о том, что ему мешает что-то сделать.

    Когда спринт завершается, scrum-master проводит demo, на котором демонстрируется список всего, что fully сделано. Затем проводится «разбор полетов» — совещание тоже на пару часов. На нем обычно пытаются выяснить, что было сделано хорошо, а что (и How) можно было сделать лучше.

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

    Также в середине спринта, иногда еще проводят «вычесывание» — совещание посвященное планированию следующего спринта. На нем обычно уточняют приоритеты задач, а так же могут разбить некоторые задачи на части и/or добавить новые задачи в product backlog – резерв продукта.

  3. В скрам участников делят на "свиней" и "кур". "Свиньи" fully задействованы в процессе, "куры" — только частично. К категории "свиней" относят следующие роли:

    • Скрам-мастер (проводит совещания, следит за выполнением принципов скрама и пр.; это кто-то из команды, produst owner не может быть скрам-мастером);
    • Владетелей продукта (Product Owner) (представляет интересы конечных пользователей и других заинтересованных в продукте сторон);
    • Команда разработки (Development Team) (кросс-функциональная команда, состоящая из специалистов разных профилей: разработчиков, тестировщиков, дизайнеров, архитекторов и т.д. Размер команды в идеале составляет от 3 до 9 человек. Команда является единственные fully вовлечённым участником разработки и отвечает за результат How единое целое. Никто, кроме команды, не может вмешиваться в процесс разработки на протяжении спринта).

    К "курам" относятся следующие роли:

    • Пользователи (Users)
    • Клиенты, продавцы (Stakeholders) (лица, которые инициируют проект и для кого проект будет приносить выгоду. Они вовлечены в скрам только во время обзорного совещания по спринту (Sprint Review));
    • Управляющие (Managers) (люди, которые управляют персоналом);
    • Эксперты-консультанты (Consulting Experts).
  4. Спринт — это одна итерация цикла разработки программного обеспечения в Скраме. Обычно спринт жёстко фиксирован по времени. Продолжительность спринта выбирается на основании размера команды, специфики работы, требований, размера проекта. Чаще всего это подбирается опытным путём, на основании проб и ошибок. В среднем спринт может быть продолжительность от 2 недель до 4 (хотя в некоторых компания его продолжительность бывает равна и 6 неделям). Для оценка объёма работ в спринте может быть использована предварительная оценка, измеряемая в очках истории. Предварительная оценка фиксируется в беклоге проекта.

  5. QA расшифровывается How Quality Assuarance (то есть "Гарантия качества", если перевести дословно). К этой категории относятся тестировщики. Это люди, которые выявляют в программе баги и ошибки. Для этого они используют разные средства, How ручные, так и автоматические. После выявления багов и ошибок они сообщают об этом разработчикам, и те исправляют эти ошибки.

  6. Product Owner (владелец проекта) — это заказчик or представитель заказчика. Это либо кто-то со стороны клиента (сторонняя фирма or физ.лицо), либо Howой-то другой сотрудник фирмы, определяющий требования к конечному продукту и следящий за их выполнением (например, бизнес-аналитик). Как уже было сказано, он определяет требования к продукту и задачи, которые должна решить команда разработки, чтобы получить конечный продукт. Список требований (or задач) он оформляет в определённым порядке и с заданным приоритетом для каждого требования (задачи). Обычно он участвует в планировании спринта (перед началом спринта) и в демонстрации результатов спринта (после окончания спринта).

  7. Во главе иерархии исключений в Java стоит класс Throwable. От не наследуются два класса: Error и Exception. Объекты первого класс выбрасываются, когда возникают Howие-то серьёзные ошибки в работе программы и java-машины в целом (а также в работе ОС и аппаратной части компьютера), так, что программа больше не может продолжать работать и закрывается. Это может быть недостаток памяти (OutOfMemoryError) or переполнение стека (StackOverflowError).

    Экземпляры второго класса могут выбраться при самых различных исключительных ситуаций. Собственно от этого класса наследуется класс RuntimeException и все остальные классы. Первый класс так выделяют, потому что, во-первых, исключительные ситуации такого типа являются непроверяемые (unchecked), а, во-вторых, к данным исключительным ситуациям относятся ошибки выполнения программы. Обычно это возникает из-за несовершенства codeа. Все остальные исключительные ситуации обычно являются следствием непредвиденного стечения обстоятельств, например, ошибки ввода-вывода.

    Также исключения делятся на проверяемые (checked) и непроверяемые (unchecked). Первые необходимо либо отлавливать в блоке try-catch, либо указывать в качестве выбрасываемых в сигнатуре метода (используя слово throws). Непроверяемые этого не требуют, и выбор остаётся за программистом. К проверяемым относятся исключения типа Throwable (а также наследуемые от него) и типа Exception (и наследуемые от него, кроме исключений типа RuntimeException). К непроверяемым относятся исключения типа Error (а также наследуемые от него) и исключения типа Runtime (и наследуемые от него).

  8. Ничего, программа просто закроется. Обычно это критические ошибки, не всегда возникшие по вине программиста (например, выход из строя жёсткого диска or сбой операционной системе). Правда, среди них есть две ошибки, которые могу следствием несовершенства codeа — это StackOverflowError и OutOfMemoryError. Первый тип ошибок возник, при переполнении стека вызовов — то есть, когда вызывается слишком много методов и стек вызовов становится слишком больший (типичный пример — бесконечная рекурсия or рекурсия с большим количеством итераций). Вторая ошибка — OutOfMemoryError — возникает, когда переполняет память отведённая под an objectы, то есть когда создаётся слишком много тяжеловесных an objectов, и они все держатся в памяти (or когда сборщик мусора не успевает их уничтожать).

  9. В Java 7 в плане исключение были введены три новых "вещи":

    • Multicatching. Это когда в одном catch-блоке сразу обрабатывается несколько исключений:

      try {
       } catch (Exception1|Exception2|Exception3| ... | ExceptionN ex) {}

      В таком случае параметр ex будет неявно иметь модификатор final. Кроме того, byte-code, сгенерированный компиляцией такого codeа (с единым catch-блоком) будет короче, чем byte-code, сгенерированный компиляцией codeа с несколькими catch-блоками.

    • Try-with-resources. Эта конструкция позволяет после слова try в скобках указать открываемые ресурсы, которые сами закроются после окончания конструкции try () {} catch{}. В качестве ресурса в данной конструкции может быть использован любой an object, реализующий интерфейс AutoCloseable.

      Во время закрытия ресурсов тоже может быть брошено исключение. В try-with-resources добавлена возможность хранения "подавленных" исключений, и брошенное try-блоком исключение имеет больший приоритет, чем исключения, получившиеся во время закрытия. Получить последние можно вызовом метода getSuppressed() от исключения, брошенного try-блоком.

    • Rethrowing. Перебрасывание исключений с улучшенной проверкой соответствия типов.

      Компилятор Java SE 7 тщательнее анализирует перебрасываемые исключения. Рассмотрим следующий пример:

      static class FirstException extends Exception { }
      static class SecondException extends Exception { }
      
      public void rethrowException(String exceptionName) throws Exception {
          try {
              if ("First".equals(exceptionName)) {
                  throw new FirstException();
              } else {
                  throw new SecondException();
              }
          } catch (Exception ex) {
              throw e;
          }
      }

      В примере try-блок может бросить либо FirstException, либо SecondException. В versionх до Java SE 7 невозможно указать эти исключения в декларации метода, потому что catch-блок перебрасывает исключение ex, тип которого – Exception.

      В Java SE 7 вы можете указать, что метод rethrowException бросает только FirstException и SecondException. Компилятор определит, что исключение Exception ex могло возникнуть только в try-блоке, в котором может быть брошено FirstException or SecondException. Даже если тип параметра catchException, компилятор определит, что это экземпляр либо FirstException, либо SecondException:

      public void rethrowException(String exceptionName) throws FirstException, SecondException {
           try {
               // ...
           } catch (Exception e) {
               throw e;
           }
       }

      Если FirstException и SecondException не являются наследниками Exception, то необходимо указать и Exception в объявлении метода.

    • Аннотации используются для размещения рядом с классом, полем, методом or переменой Howой-то дополнительной, служебной информации (метаданных), относящейся к ней. Whatбы указать аннотацию, надо над заголовком класса or метода, либо надо объявлением поля or переменной, написать после @ название аннотации (класса аннотации), например так:

      ...
      @Override
      public void doSomeThing() {
      }
      ...

      Кроме того, у аннотации могут быть свойства, они указывают в скобках через запятую в виде пар "ключ=meaning", где в качестве ключа выступает название свойства, а качестве значения — собственно, meaning, которое должно принять это свойство. Выглядит это так:

      @CatInfo(manager=Catmanager.class, unique=true)
      class Cat {}

      Если указывается указывает meaning только для одного свойства, то Name свойства и знак равно можно не писать: @SuppressWarnings("unchecked").

      Также можно вообще не ставить скобки, если ниHowим свойствам не присваиваются ниHowие значения.

      Whatбы создать свою аннотацию, надо указать модификатор доступа, потом после пробела ключевое слово "@interface" и дальше опять после пробела Name аннотации (принять начинать его с большой буква). Дальше идёт тело аннотации в фигурных скобках. Внутри тела указываются свойства в виде объявлений методов (How в интерфейсах). Также у свойств можно указать значения по умолчанию (они их будут принимать, если при указании аннотации в нужном месте, этому свойству не будет присвоено Howое-то meaning). Всё вместе это выглядит так:

      @interface CatManager
      {
       Class manager();
       boolean unique();
       String name() default "Unknown Cat";
      }

      Аннотации выполняют следующие функции:

      • дают необходимую информацию для компилятора;
      • дают информацию различным инструментам для генерации другого codeа, конфигураций и т. д.;
      • могут использоваться во время работы codeа;
      • повышают читабельность codeа и его понимание программистами.
      На данный момент компилятором используют три аннотации: @Deprecated, @Override и @SuppressWarnings. Первой аннотацией помечаются устаревшие методы и классы, нерекомендованные к использованию (компилятор по их поводу показывает предупреждение). Вторая аннтоциая ставится над переопределёнными методами класса-наследника (это позволяет контролировать связь между исходным методом и переопределённым). Третья annotation позволяет подавлять (не выводить) некоторые исключительные предупреждения, обычно выводимые компилятором в связи с данным методом or классом (например, что он уже устарел и нерекомендован к использованию).

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION