About me

My name is Marcin Chrost. I am an experienced IT Trainer and Java developer.

Working for a long time as a software developer, I've gained professional technical skills. As a team leader, I've learned how to talk with people coming from different business environments and I've also acquired skills in the field of teaching. Sharing both my hard and soft skills with other people gives me a lot of satisfaction and allows me to engage 100% in what I do. I conduct trainings and workshops (in Sages and Coders Lab) and act as presenter on conferences (4Developers, Kariera IT, JDD, Devoxx, Confitura). I am looking forward to cooperation proposals in this field.

Services

I provide services in the broad field of software development in Java - from training, through development, to emergency actions.

  • Trainings
    Does your team need to familiarize themselves with a new technology to use it in a project? Or do you want to refresh and organize your skills? You've come to the right place - I have already trained many people and I know not only how to provide knowledge, but also how to consolidate it. My trainings are always conducted in the form of workshops, to ensure hands-on experience.

  • Development
    In the heat of implementing new functionalities, it turns out that there are too few hands on deck? Don't worry - I can join the team at any time and use my skills to deliver all features on time. Here I use my battlefield experience gained over years in many international projects.

  • Emergency actions
    Have you come across any problem that is stopping the development of the project or a malicious bug that is hard to trace? Instead of wasting your valuable time on the above problems, use the help of an experienced expert - I have successfully assisted in such situations many times. Believe me - the bug is not so black as it is painted :)

Trainings

I offer closed trainings adjusted to Client's needs.

choose training

Java reactive programming with Reactor & Spring

Length

3 days

Description

The training is mainly designed for two categories of participants:

  • people who have experience in Java and Spring programming and want to learn in a practical way reactive programming with the above-mentioned tools,
  • people who already have practical experience in reactive programming, but feel the need to become better acquainted with theory.

The first two days of the training are dominated by practical tasks (60%), but nevertheless a lot of emphasis is placed on theory at the very beginning; I know from experience that this pays off later in the class. The third day is an entirely workshop day - here we use the knowledge gained during the previous days of training.

Prerequisites

Knowledge of the Java language and the Spring framework at the intermediate level

Agenda

NOTE: This is a framework programme and can always be tailored to client needs upon request

  1. Introduction to reactive programming
    • Definition
    • Reasons for introducing a reactive approach
      • Waste of resources
      • Scalability problems
    • Demo - comparison an application performance in non-reactive and reactive way
    • When not to use reactive approach
  1. Reactive Streams as a specification for reactive programming
    • Components (code, tests, textual specification)
    • Interfaces
      • Publisher - sender of elements
      • Subscriber - recipient of elements
      • Subscription - connection between sender and receiver
    • Subscription flow (start, request elements, end)
    • Backpressure and unlimited subscription
    • Overview of advanced subscription rules
  1. Reactor framework
    • General description
    • Mono and Flux as basic classes
    • Marble diagrams
    • Flux - a stream of multiple elements.
      • Creation from existing elements
      • Programmatic creation
    • Mono - single element stream
    • Subscription to streams
      • Via callbacks
      • Through BaseSubscriber.
    • Subscription cancellation
  1. Operators
    • How operators are working
      • Plugging into the subscription chain
      • Upstream, downstream
    • Mapping
      • Synchronous (map())
      • Asynchronous (flatMap(), concatMap())
    • Filtering (filter(), take(), skip())
    • Reducing (reduce())
    • Combining streams
      • Of the same types (merge(), concat())
      • Of different types (zip())
    • Time dependencies
      • Delaying elements (delayElements())
      • Triggering one stream by another (then())
    • Creating custom operators (transform())
    • How to choose the operator you need - practical tips
  1. Error handling
    • Error signalling instead of throwing an exception
    • Replacing the error signal
      • Using an element
      • Using a sequence
    • Error remapping
    • Additional action when error occurs
    • Resubscription to stream
  1. Testing
    • Introducing Reactor test helper classes
    • StepVerifier - verification of data emitted by the stream
      • Creation
      • Assertions chaining
      • Running the test
      • Virtual timer
    • TestPublisher - ability to manipulate data emission to the stream
      • Creation
      • Emitting data
  1. Debugging
    • Reactor callstack analysis
    • Enabling debugging mode
      • As a global hook
      • As a Java Agent
    • Checkpoints
    • Logging stream behavior using the log() operator.
  1. Multithreading
    • Scheduler as an abstraction of thread selection
    • Predefined and custom schedulers
    • Changing element publication thread - publishOn() operator.
    • Changing element creation thread - subscribeOn() operator.
    • Parallel processing of data in a stream
  1. Typical pitfalls of reactive programming
    • Lack of subscription
    • Too eagerly operations
    • Blocking operations in non-blocking threads
    • Excessive operators
    • Manual creation of streams
  1. Spring framework - reactive approach
    • Spring reactive stack - general description
    • Reactive HTTP server - WebFlux
      • Annotation approach
      • Functional approach
      • SSE (Server-Sent-Events) technique
      • WebSockets
    • Reactive HTTP client - WebClient
      • Creation and use
      • Combining several operations
  1. Workshop - implementation of MasterMind game in a reactive approach using Spring
    • Presentation of requirements, general outline of the architecture and provided tools
    • Implementation of the server part
    • Implementation of the client part

Clean code, OOP best practices and design patterns

Length

2 days

Description

The training is designed for developers who want to get into the habit of writing code that is readable and understandable to others. We focus not only on clean code per se, but also show how to write programs well using the object-oriented programming paradigm. We also introduce several design patterns that improve code readability and structure.

Prerequisites

Knowledge of the Java language and the JUnit library at the basic level

Agenda

NOTE: This is a framework programme and can always be tailored to client needs upon request

  1. Good code vs. bad code
    • How to define and measure code quality
    • Clinical symptoms of bad code
    • Reasons for code degradation
    • Defense against code quality deterioration
      • Code review
      • Static analysis (SonarQube)
      • Daily refactoring
  1. Basic principles in the daily work of a developer
    • Boy Scout rule
    • DRY
    • Least surprise principle
    • KISS / YAGNI
    • Usage of external libraries / frameworks
    • Iterative code development
  1. How to create good code
    • Naming of variables, methods, classes
    • Formatting
    • Creating readable methods
    • Creating understandable classes
    • Handling error situations; exceptions
    • Comments
  1. Workshop - improving the quality of existing code
    • Creation of tests
    • Step-by-step refactoring
  1. OOP best practices
    • High consistency
    • Loose coupling
    • Polymorphism instead of type checking
  1. SOLID principles
    • Dependency inversion
    • Interface segregation
    • Single responsibility
    • Open (for extension) / closed (for modification) rule
    • Liskov substitution principle
      • Surprising effects with inheritance
      • Replacing inheritance with composition
  1. Workshop - improving the structure of existing code using SOLID principles
  1. Selected design patterns in the context of creating readable code
    • Strategy ⇒ let's do one thing in many ways
    • Decorator ⇒ let's leave the side stuff to others
    • State ⇒ let's go through the entire lifecycle of our object
    • Visitor ⇒ let's collect different fruits from one tree
  1. Workshop - improving existing code using design patterns

Java novelties (JDK 12 and above)

Length

1 day

Description

The training is intended for Java developers working with version 11 (as currently the most common in commercial projects) and wishing to familiarize themselves with the new functionalities of the language introduced in versions 12 and above. Presented are those new capabilities that directly affect the shape of the code, allowing to make its writing simpler and more transparent. The conclusion of the training is a mini-workshop, during which participants put the acquired knowledge into practice.

Prerequisites

Knowledge of the Java language and the JUnit library at the intermediate level

Agenda

NOTE: This is a framework programme and can always be tailored to client needs upon request

  1. Preview features
    • Reasons for introduction
    • Lifecycle
    • Usage during compilation and execution
    • Support in automatic build tools (Maven, Gradle)
  1. Pattern matching for instanceof
    • Excessive casting
    • Pattern matching
    • Automatic casting with instanceof
    • Flow scope
  1. switch improvements
    • switch drawbacks
    • Arrow labels
    • switch as an expression
    • yield keyword
    • Exhaustiveness
  1. Pattern matching for switch
    • Types as labels
    • null handling
    • Guarded patterns
  1. Records
    • Immutable object as good design pattern
    • Record as immutable object implementation
    • Declaration
    • Features
    • Instantiation (canonical and custom constructors)
    • Limitations
    • Pitfalls
  1. Sealed classes
    • Encapsulation as good practice
    • Declaration
    • Definition of permitted subclasses
    • Sealed interfaces
    • Sealed classes vs records
  1. Text blocks
    • Declaration and usage possibilities
    • Automatic indentation
    • New special characters
  1. Other improvements
    • Teeing collector
    • Meaningful NullPointerException
    • New String built-in methods
  1. Workshop - creating an application using the previously discussed functionalities

Other

I am able to conduct any training in the field of:

  • Java programming (from beginner to advanced level).
  • Working with databases (including SQL).
  • Web application development.
  • Broadly understood good software engineering practices.

The program and scope are always adapted to the customer needs.

Contact