Things that I should master as a Java developer
Data structures
- Array
- List
- Map
- Stack - Stack
- Heap (min, max) - PriorityQueue
- Queue - LinkedList
- Graph
- BinaryTree
Algorithms
- Sorting
- Searching
- Dynamic programming
- Greedy algo
- Graph
Indexing - BTree, B+Tree, how the indexing in ElasticSearch works internally? Indexing in a distributed system
Java concurrency
Usage of Thread, Executors, ExecutorService, Future, different locks, thread-safe data structures
Race condition (deadlock, live lock) / how to resolve/avoid them?
Asynchronous tasks implementation
Immutable object
How to write thread-safe class?
How concurrency is managed in a graphical application? (UI thread, main thread, task thread)
How concurrency is managed when a Web server is processing requests?
Design Patterns in Java core library
- Proxy - java reflection proxy
- Builder
- Factory
- AbstractFactory
- Chain of responsibilities
- Decorator
- Adapter
- Strategy
Distributed System concerns
Below is quoted from Google Code University - Introduction to Distributed System Design
- Fault-Tolerant: It can recover from component failures without performing incorrect actions.
- Highly Available: It can restore operations, permitting it to resume providing services even when some components have failed.
- Recoverable: Failed components can restart themselves and rejoin the system, after the cause of failure has been repaired.
- Consistent: The system can coordinate actions by multiple components often in the presence of concurrency and failure. This underlies the ability of a distributed system to act like a non-distributed system.
- Scalable: It can operate correctly even as some aspect of the system is scaled to a larger size. For example, we might increase the size of the network on which the system is running. This increases the frequency of network outages and could degrade a “non-scalable” system. Similarly, we might increase the number of users or servers, or overall load on the system. In a scalable system, this should not have a significant effect.
- Predictable Performance: The ability to provide desired responsiveness in a timely manner.
- Secure: The system authenticates access to data and services
Streams
NIO / Sockets
Java Memory model
Optimisation GC / trouble shooting
GC overhead limit exceeded Possible memory leak
Tests
UT / AT / IT / Frameworks(cucumber, testNG, Junit, Mockito, Wiremock)
Cloud
Agile practice
- morning standup
- retrospective
- Kankan / Scrum
- Grooming to clear out the context of tasks
- task prioritize/ product oriented
- are them cumbersome to small/big teams?
- how to improve the productivity of a team?
Clean code
Continous Integration / Continous Delivery
What I think about work?
How to survive in a team? How to lead a team?
Experience working in a complex system :
- technically complex - hard problems(distributed system, performance constraints, concurrency, big codebase)
- functionally complex - requires domain specific knowledge to understand the code as a whole
- historical complex - legacy code mal-desgined