четверг, 12 ноября 2015 г.

15 вопросов к техническому интервью Java программиста с 5-6 летним опытом работы

Источник - 15-вопросов-к-техническому-интервью-Java-программиста-с-5-6-летним-опытом-работы
С ростом опыта программиста от уровня начинающего разработчика (от 2 до 4 лет опыта работы) до уровня старшего разработчика( от 5 до 7 лет) меняются и вопросы на интервью по Core Java.
Конечно такие основы как структуры данных, алгоритмы И объектно-ориентированное программирование остаются, но вопросы и ответы становятся более подробными. Я часто получаю вопросы о том какие вопросы по Core Java задают старшим разработчикам, или каких вопросов стоит ожидать на собеседовании на позицию старшего разработчика Java. Это меня на некоторое время озадачивает, ведь как только вы станете старшими разработчиками, вы автоматически начнете принимать участие в собеседованиях и вам надо иметь представление о том, чего ожидать от собеседования, но в то же самое время, я понимаю, что зная вопросы собеседовании, вам будет легче к нему подготовиться. Конечно, вы не получите вопросов которые задают программистам с 2-3 годами опыта работы с Java, хотя в начале собеседования это не исключено. Я не вижу отличий между телефонными интервью и собеседованиями с глазу на глаз. Какие то вопросы остаются теми же, какие то вопросы требуют более подробных ответов. В этой статье я поделюсь 15 техническими вопросами по Core Java, которые задавались при собеседованиях старших разработчиков во время телефонного интервью. Я не публикую все ответы, но вы можете найти их в текущем блоге или в блогеJavarevisited.

15 вопросов по Core Java для программистов с 5-6 опытом разработки.
Все вопросы были получены от работающих старших разработчиков, имеющих более чем 5 летний опыт работы. Разработчики встречались с этими вопросами на разных этапах трудоустройства, включая телефонные интервью и собеседования с глазу на глаз.

1) Как работает метод HashMap в Java?
Да, это по-прежнему один из самых популярных вопросов для старшего разработчика, вы должны ожидать его на телефонном интервью, после него возможно будет много смежных вопросов, посмотрите ответы на нихздесь.

2) Какие 2 метода должен реализовать объект ключа HashMap ? equals и hashcode

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

4) Благодаря чему в ConcurrentHashMap достигается масштабируемость ? Иногда этот вопрос звучит на интервью как: разница между ConcurrentHashMap и Hashtable в Java, поищите ответы здесь.

5) Как сделать объект общим для разных потоков? Или как передать объект от одного потока к другому ? Есть много путей реализации этого, такие как очереди, обменники, но блокируемые очереди с шаблоном проектирования Producer/Consumer это самый простой способ, чтобы передать объект из одного потока в другой.

6) Как узнать что в вашей программе есть взаимная блокировка?( Получив дамп потока, используя kill -3, применяя JConsole или VisualVM). Я предлагаю подготовиться к этому вопросу на интервью очень тщательно, так как интервьюеры любят детали, они спрашивают бывали ли в вашем проекте подобные проблемы и как вам удалось их решить. 

7) Как избежать взаимных блокировок при кодировании ? Что бы разобраться с блокировками и получить полную информацию о теме, прочтите это.

8) Что такое ожидание занятости(«Busy spinning»)? Почему вы должны использовать его ? Один из интереснейших вопросов многопоточности для старшего разработчика Java, Busy spinning это стратегия ожидания, когда поток выполняет ожидание в цикле, при этом не используя ресурсы процессора и как бызасыпая. Эту стратегию используют когда время ожидания очень мало, при этом не нагружается процессор и не останавливается поток, сохраняются все данные, которые могут быть потеряны при запуске потока на другом ядре процессора. Этот вопрос популярен у программистов создающих высоко нагруженные проекты, где программисты 
добиваются чрезвычайно низких задержек в работе, в диапазоне микро- и мили- секунд.

9) Что такое блокировка Чтения и Записи (ReadWriteLock)? Использует ли ConcurrentHashMap ReadWrite блокировки ? Блокировка Чтения и Записи это такая реализация блокировки, когда несколько разных потоков пытаются произвести операцию чтения и записи с одним объектом. сама по себе операция чтения не изменяет объект, что допускает многопоточные операции чтения без блокировок. Java предоставляет реализацию ReadWriteLock с которой стоит ознакомиться. Например ConcurrentHashMap не применяет ReadWriteLock, вместо этого он делит Hash на отдельные части и блокирует их отдельно, таким образом в любой момент времени заблокирована только часть хеша, а не он весь. Этот вопрос популярен у опытных разработчиков, обычно просят ответить подробнее, спрашивают разные реализации ReadWriteLock для разных случаев.

10) Как сделать объект иммутабельным(не изменяемым) в Java? Зачем делать объект иммутабельным ? Иммутабельность предполагает несколько преимуществ включая потокобезопасность, возможность кеширования, а так же делает многопоточный код более читаемым.
Посмотрите это и научитесь делать объекты иммутабельными. На собеседовании по этому вопросу возможны дополнительные уточнения, в зависимости от полноты вашего ответа. Например когда вы говорите, что Spring иммутабельный, будьте готовы ответить почему строки так же иммутабельны в Java.

11) Какие шаблоны проектирования в используете ?
Всегда ожидайте вопрос о шаблонах проектирования на собеседовании к вакансии старшего разработчика. Лучше отметить любой GOF шаблон, а не Singleton или MVC который использует каждый второй Java программист. Лучший ответ может быть шаблон Декоратор или шаблон Внедрение зависимости, которые довольно популярны в Spring Framework. Так же хорошо если называемые вами шаблоны проектирования вы действительно использовали и знаете к какому компромиссу ведет их применение. Как только вы произнесете название шаблона проектирования, например: «Фабрика», интервьюер тут же спросит: «Вы использовали это в своих проектах ?» Поэтому будьте готовы привести примеры и рассказать почему вы выбрали в своем проекте именно этот шаблон.

12) Знаете ли вы о принципе Открытости/Закрытости или Принцип подстановки Барбары Лисков? 
Шаблоны проектирования основаны на принципах объектно-ориентированного проектирования.
Настоятельно рекомендую посмотреть мою статью 10 принципов объектно ориентированного дизайна, которые должен знать программист Java, по крайней мере иметь представление о том как эти принципы помогут вам писать объектно ориентированный код. Если у вас нет ответа на этот вопрос, вы можете вежливо ответить «нет», никто не ожидает от вас знания ответов на все вопросы. Однако зная ответ на вопрос, который вызывает затруднения у большинства разработчиков, вы делаете свою кандидатуру на собеседовании очень сильной.

13) Какой шаблон проектирования будете использовать, что бы защитить ваш код от сторонней библиотеки, которая будет заменена через пару лет ? 
Это всего лишь один из возможных вариаций вопроса о шаблонах проектирования, которые могут быть заданы вам в зависимости от того о чем вы говорите сейчас на собеседовании. Один из способов как оградить свой код от сторонней библиотеки, это зависимость от интерфейса, а не от реализации и использование зависимостей что бы обеспечить конкретную реализацию. Подобные вопросы часто задают старшим разработчикам с 5-7 годами опыта работы.

14) Как предотвратить SQL инъекцию в коде на Java ?
Этот вопрос чаще задают Java EE разработчикам, чем обычным Java программистам, тем не менее это отличный повод узнать о PreparedStatement. PreparedStatement — это объект, который представляет предварительно скомпилированный SQL-оператор. PreparedStatement не только обеспечивает более высокую производительность, но и защищает от SQL инъекций. Если вы работаете по большей части с Java EE или J2EE, вы должны быть знакомы с некоторыми вопросами безопасности, в том числе «атака Фиксации Сессии» или «межсайтовый скриптинг», так же вам нужно уметь избегать этих атак.

15) Расскажите об отличиях типов ссылок в Java, таких как WeakReference, SoftReference иPhantomReference? И почему вы должны их использовать ?
По сути, различие между всеми типами ссылок только одно — поведение Java Garbage Collector с объектами, на которые они ссылаются. В Java объекты, создаваемые через оператор new создаются по strong ссылке. Сборщик мусора (garbage collector) уничтожает такие объекты только тогда, когда на них больше не остается сильных (strong) ссылок. В пакете java.lang.ref есть 3 класса, которые описывают 3 типа ссылок, соответственно SoftReference, WeakReference, PhantomReference. Объекты, созданные через SoftReference, будут собраны в случае, если JVM требует память. То есть имеется гарантия, что все SoftReference объекты будут собраны перед тем, как JVM выбросит исключение OutOfMemoryError. SoftReference часто используется для кешей, потребляющих большое количество памяти. WeakReference не спасает объект от финализации, даже если имеется достаточное количество свободной памяти. Как только на объект не останется strong и soft ссылок, он может быть финализирован. Используется для кешей и для создания цепей связанных между собой объектов. Объекты, созданные через PhantomReference, уничтожаются тогда, когда GC определяют, что ссылаемые объекты могут быть освобождены. Этот тип ссылок используется как альтернатива финализации (для более гибкого освобождения ресурсов).

Это весь список вопросов для интервью старшего Java разработчика. Я не включил в него многие важные вопросы об обработке исключений, сборщике мусора, настройке JVM, которые очень популярны у старших разработчиков, возможно я включу их в следующей части. Но если вы не находите ответов на какой либо из вопросов, дайте мне знать и я обновлю данный пост для моих постоянных читателей.

Оригинальная статья: 15 Technical Core Java Questions Answers for 5 to 6 Years Experienced Programmer 
Перевел dio

четверг, 23 июля 2015 г.

Статьи для перевода по Raspberry Pi и Arduino

https://www.raspberrypi.org/documentation/usage/python/
http://makezine.com/projects/tutorial-raspberry-pi-gpio-pins-and-python/
http://www.techradar.com/news/software/learn-to-program-your-raspberry-pi-1148194/2
http://openmicros.org/index.php/articles/94-ciseco-product-documentation/raspberry-pi/217-getting-started-with-raspberry-pi-gpio-and-python
http://www.classthink.com/2013/09/15/getting-started-python-raspberry-pi/
http://playground.arduino.cc/interfacing/python
http://www.toptechboy.com/using-python-with-arduino-lessons/
http://www.instructables.com/id/Arduino-and-Python/#step1
http://www.akeric.com/blog/?p=1140
http://stackoverflow.com/questions/24074914/python-to-arduino-serial-read-write
http://www.stealthcopter.com/blog/2010/02/python-interfacing-with-an-arduino/

среда, 28 января 2015 г.

Использование IntelliJ IDEA в качестве IDE для Scala, а также других функциональных языков программирования (http://eax.me/intellij-idea-scala/)

IntelliJ IDEA позиционируется, как IDE для программирования на множестве различных языков, не только Java. В частности, есть совершенно замечательный плагин для Erlang, которым я с огромным удовольствием пользуюсь уже около месяца. Еще я слышал, что есть плагин для Haskell, но пока что его не пробовал. Так вот, если с Erlang, к примеру, все довольно просто — открываешь проект и фигачишь, то со Scala есть пара нюансов, о которых мне и хотелось бы поведать.
Дополнение: Вскоре после написания этой заметки я все-таки нашел и попробовалплагин для Haskell. Поддержка этого языка оказалось самой базовой. Имеется подсветка синтаксиса, в том числе внутри cabal-файлов, работают простые вещи вроде перехода в пределах текущего файла к определению функции по нажатию F4, есть базовый автокомплит (Alt + /). До уровня полноценной IDE определенно не дотягивает. С другой стороны, как минимум, этот плагин не хуже, чем Vim. Еще в настоящее время активно разрабатывается альтернативный плагин HaskForce, но согласно описанию «this plugin is in its early stages and is not ready for use», поэтому я его даже не смотрел.
Как и все плагины, плагин для Scala устанавливается через File → Settings → Plugins → Browse repositories. Находим плагин с именем «Scala», устанавливаем, перезапускаем IDE. Там же можно поставить плагин для Erlang и других языков.
Теперь создадим новый проект. IntelliJ IDEA умеет работать как с Maven, так и SBT(как я понимаю, есть еще такая штука Gradle, которая также поддерживается). Коллеги-скалолазы пользуются Maven, в связи с чем он мне больше интересен. Поэтому далее речь пойдет о нем.
Если коротко, то после раскуривания StackOverflow и различных туториалов, у меня получился такой pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>me.eax.examples</groupId>
  <artifactId>screenshot-maker</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>
      UTF-8
    </project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>2.11.1</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <version>2.15.2</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <args>
                <arg>-deprecation</arg>
              </args>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>

      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>
                me.eax.examples.screenshot_maker.ScreenshotMaker
              </mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
После сохранения изменений в pom.xml IntelliJ IDEA осознает, что в вашем проекте используется Scala, а также подтянет все нужные плагины для Maven. Алсо в проекте не повредит создать файл .gitignore. Воспользуемся тем же файлом, что приводился в заметке Функциональщик ботает Java — работа со сторонними библиотеками и хождение в РСУБД через JDBC:
# Eclipse
.classpath
.project
.settings/

# Intellij
.idea/
*.iml
*.iws

# Mac
.DS_Store

# Maven
log/
target/
Далее открываем окно Project и создаем каталог src/main/scala. Жмакаем по каталогу правой кнопкой мыши и говорим Mark Directory As → Sources Root. После этого каталог должен сменить цвет с оранжевого на синий, а в его контекстном меню станут доступны пункты для создания пакетов и классов (кстати, отчего бы сразу не создать парочку?). Аналогичным образом создаем каталог src/test/scala, только помечаем его как Test Sources Root. Если вы не планируете использовать в проекте Java, то каталоги src/*/java можно удалить. В результате должна получить примерно такая картинка:
Использование IntelliJ IDEA в качестве IDE для Scala
Как вы уже догадались, чтобы не писать банальный «Hello World», я решил написать простенькую программку для создания скриншотов.
Исходный код:
package me.eax.examples.screenshot_maker

import java.awt._
import java.io._
import javax.imageio._

object ScreenshotMaker extends App {
  def executableName : String = {
    System.getProperty("sun.java.command")
  }

  def makeScreenshot(fileName: String) {
    val toolkit = Toolkit.getDefaultToolkit
    val rect = new Rectangle(toolkit.getScreenSize)
    val capture = new Robot().createScreenCapture(rect)
    ImageIO.write(capture, "png"new File(fileName))
  }

  if(args.isEmpty) {
    println(s"Usage: ${executableName} screenshot.png")
  } else {
    makeScreenshot(args(0))
  }
}
Между прочим, приведенный выше скриншот был сделан при помощи этой самой программы, а затем отредактирован в Gimp.
Сочетание Shift + F10 не будет работать, пока вы не объявите класс, который «extends App». Что интересно, в IntelliJ IDEA есть поддержка REPL. В частности, Shift + F10 его и открывает. Также в REPL можно попасть нажатием Ctr + Shift + D или выделив кусок кода и нажав Ctr + Shift + X. В последнем случае выделенный код будет выполнен в REPL. Само собой разумеется, в REPL можно выполнять любой код, при этом работает автокомплит, просмотр документации (Ctr + Q), подсказка по аргументам (Ctr + P) и есть история. Это офигительно удобно! Запускается набранный в REPL код сочетанием Ctr + Enter.
Кстати, в Erlang’овом плагине вроде как тоже есть поддержка REPL, но там все как-то сложно. Я пока не осилил и работаю с REPL по старинке, из консоли.
Собрать standalone jar, как мы это уже когда-то выясняли, можно командой:
mvn clean compile assembly:single
Пара небольших советов.
Hint номер один. В IntelliJ IDEA можно создавать шаблоны проектов — Tools → Save Project as Template. Hint номер два. Несмотря на то, что IntelliJ IDEA умеет интегрироваться с Git, а также другими системами контроля версий, в реальных проектах с кучей веток и зависимостей намного удобнее работать с Git в консоли(Alt + F12). И это может относится не только к Git. При программировании на Erlang я пишу код локально, затем заливаю его на dev-сервер и собираю уже там — все это из консоли IntelliJ.
Общие впечатления от плагинов как для Scala, так и для Erlang, исключительно положительные. Сочетания клавиш, всякие там рефакторинги (включая краевые случаи вроде инлайнинга при использовании интерполяции строк), переходы к определению методов и так далее — в первом приближении все работает. Иногда, довольно редко, всплывают небольшие баги, но до сих пор не было ни одного критичного. И в любом случае, даже с этими багами писать код в IntelliJ IDEA оказалось намного удобнее, чем в Vim. Поначалу, само собой разумеется, немного непривычно. Но поработайте с этой IDE пару недель, и вам не захочется слезать ни на что другое.