Part 3 of My OCP Journey: Practical Tips and Examples
Like learning a foreign language, you have to write original code if you want to master Java deeply. Make your examples fun, and life-like. They'll stick with you.
Join the DZone community and get the full member experience.
Join For FreeThis is the third and final post about my OCP-17 preparation. In part one, I explained how playing a human virtual machine and refreshing your mastery of arcane constructs is not pointless, even if the OCP doesn’t — and doesn’t claim to — make you a competent developer. In the second part, I showed you how intrinsic motivation keeps itself going without carrots or sticks, provided you can find ways to make your practice fun and memorable. It's time to share some of these examples and tips.
Make It Quality Time
But first some advice about logistics and time management. As with physical exercise, short and frequent trumps long and sporadic. It’s more effective and more likely to become a habit, like brushing your teeth. Choose the time of day when you are most energetic and productive. The early morning works best for me because I’m a morning person. And there is a satisfaction in getting the daily dose crossed off your to-do list, even when it doesn’t feel like a chore.
Make a good balance between reading, practicing, and revising. Once you’ve worked through the entire textbook you will need to refresh much of the first few chapters. That’s okay. Keep revising them, doing a few questions from each chapter each day. You’ll get there slowly, but surely.
Make It Practical and Productive
Practice in the previous paragraph means writing novel code aimed to teach yourself a certain language construct. It’s about your productivity, so copying snippets from the book doesn’t count. If you’ve ever learned a foreign language the old-fashioned way, you will agree that cramming vocabulary and grammar rules does little for your oral skills. Only speaking can make you fluent, preferably among native speakers. It’s like swimming or playing the saxophone: you can’t learn it from a book. Never used the NIO2 API or primitive streams? Never done a comparison or binary search of arrays? Get your feet wet, preferably with autocomplete turned off. Better even, scribble in a plaintext editor and paste it into your IDE when you’re done.
Understand the Why
While Java shows its age, its evolution is managed carefully so new additions don’t feel as if they were haphazardly tacked on. Decisions take long to mature and were made for a reason. When the book doesn’t explain the reasoning behind a certain API peculiarity, try to explain it to yourself instead of parroting a rule. Here’s a case in point from the concurrency API.
The submit()
method of an executor has two overloaded versions for a Runnable
or Callable
argument. It returns a Future
. The void execute()
method only takes a Runnable
, not a Callable
. Why does that make good sense? Well, a Callable
yields a value and can throw an Exception. Since execute()
acts in a fire-and-forget fashion, the result of a Callable
would be inaccessible, so it’s not supported. Conversely, submitting a Runnable
with a void result is fine. Its Future
returns null.
The memory athletes from my previous post, who memorized random stacks of cards, have it much tougher than you and I. Learning Java is about memorizing a lot of facts, but they’re not random.
Making a Visual Story
The ancient Greeks taught us how to construct mental memory palaces to store random facts for easy retrieval. Joshua Foer added a moonwalking Albert Einstein to jog his memory. You should make your code samples equally fun and memorable.
Here’s how to illustrate the fundamental differences between an ArrayList
and a LinkedList
. Imagine a movie theater with a fixed number of seats (the ArrayList
) and a line of patrons (the LinkedList
) at the ticket booth, who receive a numbered ticket. People arrive (offer(..)
or add(..)
) at the tail of the queue irregularly while every ten seconds the first person in the queue can enter the theater (poll()
, element()
) and is shown to their seat (seats.set(number, patron)
.
Let’s add concurrency to the mix. Suppose there are two ticket booths, each with its own line, and a central ticket dispenser that increments a number. That’s right: getAndIncrement()
in AtomicInteger
to the rescue. I’d happily show you the code, but that wouldn’t teach you much.
Or take access rights in class hierarchies. Subtypes may not impose stricter access rights or declare broader or new checked exceptions. Let’s put it less academically. Imagine a high rise with multiple company offices (classes) and several floors (packages). Private access is limited to employees of one company. Package access extends to offices on the same floor. Public access is everybody: other floors as well as external visitors. The proprietor provides a public bathroom that clearly shows when it’s occupied. You can dress it up with scented towels and music through a subclass, but you must obey this contract:
public void visitRestRoom(Person p) throws OccupiedException { .. }
Every outside visitor is welcome to use it. You are not allowed to restrict access to only employees on your floor (package access), much less your own employees (private access). Neither may you bother visitors with a PaymentExpectedException
. It violates the contract.
Code samples in the exam are meant to confuse you. Your own examples should do the exact opposite. You use real-life examples (a public office restroom, the queue outside a movie theater) and combine them in a way that is easy to visualize and fun to remember.
Mnemonics
Sometimes there’s nothing for it but to commit stuff to memory, like the types you can use as a switch variable (byte, int, char, short, String, enum, var). You can string them together in a mnemonic like this one:
In one short intense soundbite, the stringy character enumerated the seven variables for switch.
Or how about the methods that operate on the front of a queue (element, push, peek, pop, poll, and remove)?
Elmer pushed to the front of the queue to get a peek at the pop star, but he was pulled out and removed.
Yes, it’s far-fetched, silly, and outlandish. That’s what makes them memorable. To me at least.
Or try your hand at light verse. The educational benefit may not be as strong for you as a reader, but the time I spent crafting it made sure I won’t quickly confuse Comparable and Comparator again.
The Incomparable Sonnet
You implement Comparable to sort
(in java.lang: no reason to import).
CompareTo runs through items with the aim
to see if they are different or the same.
If it returns a positive, it meant
that this was greater than the argument.
For smaller ones a minus is supplied,
a zero means the same, or “can’t decide”.
Comparator looks similar, but bear
in mind its logic is more self-contained.
It has a single method called compare
where difference of two args is ascertained.
A range of default methods supplement
your lambdas. Chain them to your heart’s content!
Some Closing Thoughts
The aim of your practice is not to pass the exam as quickly as possible (or at all). It’s to become a more competent developer and have fun studying. I mentioned that there is some merit in playing human compiler, but that doesn’t mean that I fully agree with the OCP’s line of questioning in its current form and the emphasis on API details. Being able to write code from scratch with only your limited memory to save you is not a must-have skill for a developer in the coming decade. She will need to acquire new skills to counter the relentless progress of AI in the field.
If I needed to assess you as a new joiner to our team, and you showed me a 90% OCP passing grade, I’d be seriously impressed and a little jealous, but I will still not be convinced that you’re a great developer until I see some of your work. You could still be terrible. And you can be a competent programmer and fail the exam. That’s where the OCP is so different from, say, a driving test. If you’re a bad driver you should not get a license, no exceptions. And if you fail the test, you’re not a great driver. Full disclosure: it took me four tries.
If the original C language was a portable toolbox and Java 1.1 a toolshed, then Java 17 SE is a warehouse with many advanced power tools. The great thing is that you don’t have to wonder what all the buttons do. The instructions are clearly printed on the tools themselves through autocomplete and Javadoc. It makes sense to know what tools the warehouse stocks and when you should use them. But learning the instructions by heart? I can think of a better use of my time, energy, and memory.
Opinions expressed by DZone contributors are their own.
Comments