JavaRush /Java Blog /Random-IT /Livello 38. Risposte alle domande dell'intervista sull'ar...
lichMax
Livello 40
Санкт-Петербург

Livello 38. Risposte alle domande dell'intervista sull'argomento del livello

Pubblicato nel gruppo Random-IT
Livello 38. Risposte alle domande dell'intervista sull'argomento del livello - 1Ciao. Ancora una volta, sembra che non ci siano risposte alle domande di questo livello. Quindi, come al solito, pubblico il mio. All'improvviso qualcuno aiuterà (o qualcuno aggiungerà qualcosa o risponderà meglio). Quindi le domande erano:
  1. Cos'è Agile?
  2. Cos'è Scrum?
  3. Quali ruoli Scrum conosci?
  4. Cos'è uno sprint? Raccontacelo con i dettagli
  5. Chi sono i QA?
  6. Chi è il proprietario del prodotto?
  7. Spiegare la gerarchia delle eccezioni
  8. Cosa fare se la JVM genera un errore?
  9. Quali innovazioni nell'area delle eccezioni in Java 7 conosci?
  10. Perché sono necessarie le annotazioni? Come usarli?
E ora le mie risposte:
  1. Agile è una serie di approcci allo sviluppo del software incentrati sull'uso dello sviluppo iterativo, sulla formazione dinamica dei requisiti e sulla garanzia della loro implementazione come risultato dell'interazione all'interno di gruppi di lavoro auto-organizzati costituiti da specialisti di diversi profili. Esistono diverse tecniche legate alla metodologia di sviluppo flessibile, in particolare la programmazione estrema, DSDM, Scrum, FDD.

    Concetti base dei metodi agili:

    • le persone e le interazioni sono più importanti dei processi e degli strumenti;
    • un prodotto funzionante è più importante di una documentazione completa;
    • la collaborazione con il cliente è più importante che concordare i termini del contratto;
    • la volontà di cambiare è più importante che attenersi al piano originale.

    Sono stati inoltre formulati i principi di base di questo approccio:

    • soddisfazione del cliente attraverso la consegna tempestiva e ininterrotta di software prezioso;
    • accogliere i cambiamenti nei requisiti anche alla fine dello sviluppo (questo può aumentare la competitività del prodotto sul mercato);
    • Consegna frequente di software funzionante (ogni mese o ogni settimana, o anche più spesso);
    • comunicazione stretta e quotidiana tra il cliente e lo sviluppatore durante tutto il progetto;
    • il progetto è portato avanti da persone motivate a cui vengono fornite le condizioni di lavoro, il sostegno e la fiducia necessari;
    • Il metodo consigliato per trasmettere informazioni è la conversazione personale (faccia a faccia);
    • il software funzionante è la migliore misura del progresso;
    • sponsor, sviluppatori e utenti devono mantenere un ritmo costante indefinitamente;
    • costante attenzione al miglioramento delle competenze tecniche e del design user-friendly;
    • semplicità: l'arte di non fare lavori inutili;
    • i migliori requisiti tecnici, architettura e design provengono da un team auto-organizzato;
    • adattamento costante alle mutevoli condizioni.

    Il problema principale dello sviluppo è stato riconosciuto nel fatto che nessuno dei partecipanti in nessuna fase aveva informazioni complete su cosa fare.

  2. Scrum è una delle tecniche di sviluppo agile. Si concentra sul controllo di qualità del processo di sviluppo. La caratteristica principale di Scrum è la divisione del processo di sviluppo in iterazioni con una durata chiara (di solito 2-6 settimane; sono chiamate “sprint”).

    В начале спринта проводится "планирование спринта" — совещание на 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 в объявлении метода.

    • Le annotazioni vengono utilizzate per posizionare accanto a una classe, campo, metodo o variabile alcune informazioni aggiuntive sul servizio (metadati) ad esso correlate. Per indicare un'annotazione è necessario scrivere il nome dell'annotazione (classe di annotazione) dopo il titolo @ della classe o del metodo, oppure la dichiarazione di un campo o di una variabile, ad esempio:

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

      Inoltre, un'annotazione può avere proprietà; queste sono indicate tra parentesi, separate da virgole, sotto forma di coppie "chiave=valore", dove la chiave è il nome della proprietà e il valore è il valore effettivo che questa proprietà dovrebbe prendere. Sembra questo:

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

      Se specifichi un valore per una sola proprietà, il nome della proprietà e il segno uguale possono essere omessi: @SuppressWarnings("unchecked").

      È anche possibile omettere del tutto le parentesi se a nessuna proprietà viene assegnato alcun valore.

      Per creare la propria annotazione è necessario specificare il modificatore di accesso, poi dopo lo spazio la parola chiave " @interface " e poi ancora dopo lo spazio il nome dell'annotazione (iniziare con la lettera maiuscola). Poi c'è il corpo dell'annotazione tra parentesi graffe. All'interno del corpo, le proprietà sono specificate sotto forma di dichiarazioni di metodo (come nelle interfacce). Puoi anche specificare valori predefiniti per le proprietà (li accetteranno se, quando si specifica un'annotazione nel posto giusto, a questa proprietà non viene assegnato un valore). Nel complesso appare così:

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

      Le annotazioni svolgono le seguenti funzioni:

      • fornire le informazioni necessarie al compilatore;
      • fornire informazioni a vari strumenti per generare altro codice, configurazioni, ecc.;
      • può essere utilizzato mentre il codice è in esecuzione;
      • aumentare la leggibilità e la comprensione del codice da parte dei programmatori.
      Attualmente, il compilatore utilizza tre annotazioni: @Deprecated, @Overridee @SuppressWarnings. La prima annotazione contrassegna metodi e classi obsoleti che non sono consigliati per l'uso (il compilatore visualizza un avviso al riguardo). La seconda annotazione viene posizionata sui metodi sovrascritti della classe discendente (questo consente di controllare la connessione tra il metodo originale e quello sovrascritto). La terza annotazione consente di sopprimere (non stampare) alcuni degli avvisi eccezionali tipicamente emessi dal compilatore riguardo a un determinato metodo o classe (ad esempio, che è deprecato e deprecato).

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION