Read “Effective Java”, as mentioned. Ok, now do it again and write code samples or find ones in your code to fix to adhere. Alright, now codify the rules in your linter and make it part of the coding standard for your team (with whatever exceptions are a must). Read it again.
Read “Java Concurrency in Practice”. Explain to the most junior engineer you know why the idiomatic solution for double-checked locking works (with volatile, with local cached version, etc). Then explain that this is why you use memozing suppliers instead of hand-writing this. Write different concurrent code with native @synchronized critical sections. Do it with methods instead of a brief section. Use ReentrantLocks instead. Now do it without locks using Atomics, Suppliers, etc. Ok, now with chained futures. Alright, do readers/writers. Ok, now modify criteria with deadline for readers to avoid starvation if many writers are queued.
Learn how to create type safe arrays of a type determines via reflection. Now never do that in production code.
Compile a class file. Use javap to disassemble the class file. Make changes, do it again, see what changes. Dex it for android, then use dexdump to evaluate the dexed version. Repeat all of these steps. Tell me why you can’t have more than 65536 methods in one dex file, and which instruction is the limiting factor.
Write a function in C. Have it add or multiply two numbers. Simple. Call it through JNI.
Read the source code for Java and Guava collections.
Oh, now that you’ve done all that: why do you care what’s under the hood? Are you needing to write your own JVM or a new GC, or needing to tune behaviors for a given workload? Do you just want to write idiomatic Java and know how to debug it? As mentioned above, this is X-Y. What do you want to achieve, and why do you think knowing java under the hood will help?
In my opinion, concurrency, memory management, serialization, reflection are few of the complex topics that most developers don't understand the internal workings of.
Effective Java by Joshua Bloch (an ex-googler) is a great book for advanced topics. See if you find some codelabs to do online for the topics.
One last bit, I would like to understand your motivation behind getting deeper (to avoid X-Y problem https://en.wikipedia.org/wiki/XY_problem). I have built products using java myself, and rarely I had to do super-deep; and when I had to, I just looked up primers quickly. But if you're passionate about programming languages in general, I understand.
I've been asking this question about Java myself too so thanks for the question and the answers so far!
Instead of answering this for Java specifically, I want to take a step back and share the different levels of depth that a SWE can harness to solve different types of problems. Perhaps it'll help you clarify what level of depth you want to get to.
Resources wise, I do think you're right that the ratio of content for deeper levels of expertise is low when compared to more basic levels, but if you look closely on SWE forums and follow strong developers on social media, you'll find repeated references to what I would call classic materials. The most "classic" materials are the documentation for the original language or framework itself. I actually think these resources are almost always underrated since everyone prefers to read the latest and greatest. If you pivot from quick and snappy internet content to studying the classics and exercise learned concepts through writing and re-writing real code, you'll be able to achieve any level of proficiency you want.
Hey OP, here is a blueprint for a project.
It's great you've listed some interests of yours. I suggest going to Kaggle and finding a dataset you're interested in. The bigger the better (think 50/100+ GB) and if it updates everyday even better.
Always happy to chat over Slack DMs (@Sai B) or LinkedIn if you have more questions
I have a different take from Alex, as I'm more positive on the BootCamp. Big disclaimer upfront: I haven't taken it, so you should read what I write with a big grain of salt and also take to folks who actually have taken in (and get both the good and the bad from them).
Here are a few things to think about:
One, the cost of the bootcamp is steep at $2K. But compared to other bootcamps that charge north of $10K, it's not so steep. I myself took one of those expensive bootcamps.
Two, a big factor to me is whether or not you're currently working. If not, I think the BootCamp makes more sense. From folks I've spoken to who have done it, the commitment is min 10 hours/week, and can be 20 or 30 depending on how "well" you want to do. Zach gives a "Superb" certification and that means you have to attend every lecture, do all the homework, and have a great project. I imagine that takes a good deal more than 10 hours per week to get. Balancing that on top of a full-time job is doable but difficult. Whereas if you're not currently employed, the structure of the bootcamp can be a good supplement to the applying, networking, and learning you're doing on your own.
Three, the mental-model I have for time spent outside of a job has 6 buckets to it:
applying to jobs
networking
interview prep (e.g. Leetcode)
projects
courses/learning
Bonus: 6) Open source contributions
I think the BootCamp will help you with all 5 of those. You'll get a capstone project or two, so should hopefully come away with a good resume/portfolio project. You'll learn a ton of DE material that's relevant for Big Tech. I believe Zach has an interview prep module. You'll get to network with and meet other Data Engineers (and other folks taking the BootCamp). And you'll be part of Zach's network so that when recruiters come to him, you'll be a name on his list. And if you do a great job in the BootCamp, you'll be towards the top of that list.
Zach also is marketing the camp towards people who have pre-existing DE knowledge, so the quality of your networking should be higher.
Of course, the decision also depends on your financial situation.
But on the whole, if you're not currently working, I'm leaning towards taking it.