Junior Java Developer (deep materials)

Это страница материалов для углубленного изучения курса Junior Java Developer. Так же Вы можете посмотреть главную страницу курса, детальный план курса, материалы, контроль входных знаний, контроль выходных знаний.

ШАБЛОНЫ ПРОЕКТИРОВАНИЯ

Если для Junior Java Developer "Библией" шаблонов является GoF, то для J2EE Senior - это уже "триада" (GoF + CoreJ2EE + Фаулер).

- "Core J2EE Patterns: Best Practices and Design Strategies (2nd Edition)" или весьма некачественный перевод на русский первого издания "Образцы J2EE. Лучшие решения и стратегии проектирования". Обратите внимание - во второе издание добавлено 6 шаблонов (всего 21) по сравнению с первым изданием (15 шаблонов). Шаблоны корпоративной разработки на J2EE с точки зрения специалистов Sun. Книга поддерживается сайтом corej2eepatterns.com с великолепной диаграммой шаблонов.

- "Real World Java EE Patterns Rethinking Best Practices" - пожалуй единственная в своем роде резкая, но конструктивная критика предыдущей книги. Основная мысль - с переходом к EE 6 и EJB 3 многие шаблоны изложенные в "Core J2EE Patterns" стали встроенными возможностями стека технологий. Для ряда проблем предложены иные решения. Автор называет себя "кодирующий архитектор" - книга изобилует примерами кода. Очень хороша для погружения в мир EE 6 + EJB 3.

- "Шаблоны корпоративных приложений" (Patterns of Enterprise Application Architecture) Мартина Фаулера. Шаблоны корпоративной разработки изложены с более общих позиций. Примеры на Java + C#. Книга поддерживается сайтом Фаулера.

ИДИОМЫ / ШАБЛОНЫ РЕАЛИЗАЦИИ
Если шаблон - это повторяемая архитектурная конструкция, то идиома/шаблон реализации - это повторяемая конструкция более низкого уровня.

"Шаблоны реализации корпоративных приложений" (Implementation Patterns) Кента Бека. Великолепная книга от автора JUnit, методологии TDD и практики XP в которой на 160 страницах собрал 77 "маленьких, но важных решений, постоянно принимаемых нами, когда мы создаем код и классы". "Шаблоны реализации заполняют пробел между проектированием и программированием".


SQL, JDBC, MySQL, шаблоны работы с данными
- Нормальные формы
- уровни изолированности транзакций
- реализации БД блокировочники/версионники
- MySQL internals
- Postgres internals
- Oracle internals
- MS SQL Server internals

JAVA IN WEB
- Asynchronous API (Servlet 3.0)
- понятие про неблокирующие/асинхронные сокеты, Netty
- кластеризация, высоконагруженные сайты


    JAVA CORE FACTS

    base    
    - односвязный список (chained exceptions)
    - двухсвязный список (LinkedList)
    - бинарное дерево (TreeMap, TreeSet)

    многопоточность
    - synchronized + wait()/notify()/notifyAll() - это концепция монитора, придумана Хоаром
    - с каждым монитором связано два "невидимых" множества - wait set и blocket set. Thread.State.WAITING + Thread.State.BLOCKED
    - знать разницу между Runnable и Callable
    - уметь пользоваться Executor / ExecutorService / ScheduledExecutorService
    - знать, что стандартный способ остановки потока - thread.interrupt(), а не thread.stop()/destroy(). Знать, что значит InterruptedException

    коллекции
    - TreeSet реализован как множество ключей TreeMap, HashSet реализован как множество ключей HashMap
    - TreeMap - это бинарное сбалансированное дерево поиска (Красно-Черное дерево), время вставки, поиска, удаления - O(log(n))
    - HashMap - это хэш-таблица с открытым хэшированием и закрытой адресацией, время вставки, поиска, удаления - O(1). Хэш-таблицы с закрытым хэшированием и открытой адресацией в коллекциях нет
    - основные конкурент java Collection API - Google Guava, Trove
    - есть не только SortedSet, но и NavigableSet. Есть не только SortedMap, но и NavigableMap
    - LinkedList - это двухсвязный список, который кроме того еще и Deque и Queue
    - Deque - это абстракция очереди с двумя концами
    - Queue - это абстракция очереди с одним концом
    - HashMap - это  обновленный Hashtable, ArrayList - обновленный LinkedList, StringBuilder - обновленный StringBuffer
    - ArrayList имплементит маркер интерфейс RandomAccess
    - LinkedHashMap (+LinkedHashSet) - это хэш-мапа, которая помнит ПОРЯДОК ВСТАВКИ

    алгоритмы
    - сортировки: быстрая, слиянием
    - сортировки: пузырек, выборками, вставками
    - индексы в БД: B-tree, hash, bitmap

    io/nio
    - Adapter: InputStreamReader / OutputStreamWriter, DataInputStream / DataOutputStream, FileInputStream / FileOutputStream, ByteArrayInputStream / ByteArrayOutputStream, ObjectOutputStream / ObjectInputStream, StringReader / StringWriter, FileReader / FileWriter
    - Decorator: BufferedInputStream / BufferedOutputStream, BufferedReader / BufferedWriter, GZIPInputStream, GZIPOutputStream
    - в Java можно выделять память за пределами heap 2мя разными способами: ByteBuffer.allocateDirect(...) + MappedByteBuffer

    OOP
    - Принципы ООП: полиморфизм, инкапсуляция, наследование, абстракция
    - Полиморфизм бывает (wiki): функций (Ad-hoc polymorphism - vethod overloading, subtype polymorphism - method overridin), типов данных - parametric polymorphism (generics).
    -  

    OOD (classes)
    - SOLID (SRP, OCP, LSP, ISP, DIP) (Single responsibility, Open-closed, Liskov substitution, Interface segregation, Dependency inversion)

    Single responsibility principle = an object should have only a single responsibility = A class should have one, and only one, reason to change.
    Open/closed principle = “software entities … should be open for extension, but closed for modification” = You should be able to extend a classes behavior, without modifying it.
    - Template Method: OutputStream.write(byte[]) by write(int)
    - Template Method: LinkedHashSet / LinkedHashMap
    - Plugin: ImageIO + ServiceLoader (Java Extension Mechanism)
    - Plugin: ???
    - Business Login in JavaScript    
    - Constant in class vs Constant in properties/xml

    Liskov substitution principle = “objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program”. See also design by contract = Derived classes must be substitutable for their base classes.
    Interface segregation principle = “many client specific interfaces are better than one general purpose interface.” = Make fine grained interfaces that are client specific.
    Dependency inversion principle = one should “Depend upon Abstractions. Do not depend upon concretions.” Dependency injection is one method of following this principle = Depend on abstractions, not on concretions.
[wiki, origin]
    OOD (packages)

    Рackage cohesion, they tell us what to put inside packages:
    REPThe Release Reuse Equivalency Principle = The granule of reuse is the granule of release.
    CCPThe Common Closure Principle = Classes that change together are packaged together.
    CRPThe Common Reuse Principle = Classes that are used together are packaged together.
    The couplings between packages, and talk about metrics that evaluate the package structure of a system.
    ADPThe Acyclic Dependencies Principle = The dependency graph of packages must have no cycles.
    SDPThe Stable Dependencies Principle = Depend in the direction of stability.
    SAPThe Stable Abstractions Principle = Abstractness increases with stability.
    [origin]



    SLAB = Single Level of Abstraction Principle = "keep all the operations in a method at the same level of abstraction."

    - Law of Demeter

    - Inversion of Control Containers and the Dependency Injection pattern
    - Mocks Aren't Stubs (stub, mock, fake, dummy)
    - Continuous Integration
    - Is Design Dead? (XP, design, UML, Agile, architecture, ...)
    - The New Methodology (Agile)
    - Principles Of XP

    
code style / code convention
    - Робер Мартин "Чистый код", глава 2, глава 3, глава 6
    - Кент Бек "Шаблоны реализации корпоративных приложений"
    - Фаулер «Рефакторинг. Улучшение существующего кода»
    - Макконелл «Совершенный код. Практическое руководство по разработке программного обеспечения»

    JVM: gc, finalize(), Weak/Soft/Phantom Reference, ReferenceQueue
    идиомы
    - в Java стандартные GC работают на основе поиска достижимых объектов, а не на основе подсчета ссылок. Memory Management in the Java
HotSpot™ Virtual Machine
    - проблемы finalize(): 
1) не гарантированно вызовут
2) в finalize() можно повторно опубликовать объект
3) нельзя упорядочить вызовы finalize()
4) можно повесить вызывающий поток и прибить finalize подсистему
5) проглатывает исключения
    - WeakReference - хорош для реализации канонических объектов (Flyweight), длоя хранения частей объектов во внешних хранилищах.
    - SoftReference - хорош для кэшей.
    - PhantomReference - хорош для замены finalize()
    - ReferenceQueue - это очередь ссылок (Weak-, Soft-, Phantom-) на убранные (get()==null) объекты
Java References