Over the past year I've been trying to learn java and computer science overall, including taking Java I and II, and now taking a course on data structures. Over time I've been really overwhelmed with how my instructor(s) or books I'm reading tend to assume the student/reader already knows various things when I would think they don't. For example, I recently worked on a binary search algorithm where at the very end of the assignment it said to run test cases, such as with junit. I never heard that term or come across it in the last year and when I googled a tutorial on it, in some cases it was basically a book going over it, like here.
I'm in my thirties, work full time at a job that isn't computer related, but do have time after work and on the weekends, yet still find learning this stuff overwhelming. I'm writing this post to ask if anyone had any advice on how they learned over time, if certain approaches benefitted them more than others, etc. I feel like I may be spending enormous amounts of time not learning effectively, similar to how Anders Ericsson has discussed in his books and research people often do, rather than deliberate practice (where you get immediate feedback).
In case there's confusion, I'm asking about java but also learning about computers in general.
From time to time I read books and web sites to try to fill in gaps and to learn new (or newer) things such as Spring.
I think that structured learning is fine and it does have it's place, however I not everyone learns things the same way.
Perhaps it's time to take a break from your structured learning and explore a bit with a custom project.
There are plenty of things that you could program, and even if someone has programmed them you haven't so do not worry about duplicates.
Here are a few of ideas to do (all text based) which are not structured:
You could add features to games such as:
With this you will get into use databases, lambdas, text files, date and time APIs, streams, loops, decision structures and more.
Perhaps when things become more fun you will be more energized and along the way you may not even realize that you are learning things.
Maybe taking a detour and learning some Android development could revitalize you.
Or maybe it would be fun to take a side trip to learn Kotlin or Scala?
One question I think you should ask yourself is "What do I hope to do with all of this knowledge?". Learning new is great and helps to keep your mind active which is the best way to keep your mind healthy and reduces illness like Alzheimer.
You don't need to post your answers to these questions, but you should think about those answers.
One book I like to recommend is "How to Think Like a Programmer" by V. Anton Spraul. The book presents some very useful ways to approach problem solving. I wish more instructors used this book as a supplemental reference or maybe use it as a main reference with books about syntax and language mechanics as supplemental resources.
As far as deliberate practice is concerned, I would recommend the book by Corey Haines, "Four Rules of Simple Design" . This may seem a little bit too advanced for a beginner but it's a great reference for anyone who wants to learn the practice of Test-Driven Development, of which a testing framework like JUnit is an essential tool that facilitates the practice. Corey Haines started the Global Day of Code retreat which is all about deliberate practice and his little book is a compilation of lessons he has learned from facilitating GDCR over the past number of years.
Junilu Lacar wrote:It's good that you're thinking about deliberate practice because I think that's important.
I'm not to sure that is what Brian said, but it is something that I suggested to help learn. Not that you can't agree with me, if in fact you are.
I think that Brian was wondering how people have learned over time or what approaches they thought were good or bad.
Brian King wrote:how Anders Ericsson has discussed in his books and research people often do, rather than deliberate practice
Anders Ericsson wrote: (From "The Making of an Expert"): It will take you at least a decade to achieve expertise, and you will need to invest that time wisely, by engaging in “deliberate” practice—practice that focuses on tasks beyond your current level of competence and comfort.
Anders Ericsson's definition of "deliberate practice" is very similar to Haines' definition of the kind of practice you do at the Global Day of Code Retreat.
Once you have a good familiarity with language syntax, you should start looking into principles of programming and design. Things like Clean Code, refactoring, SOLID, GRASP, SLAP, KISS / DRY, Law of Demeter, Four Rules of Simple Design, etc. are the things that will tell you if you're getting better or not at not just writing code but designing solutions that are easy to understand and maintain. I would even dare to say that you should at least try to make yourself aware of what these different principles are even though you don't fully understand their practical applications. Just having an awareness of their existence opens up your mind to many avenues for improving your code and at the very least gives you a way to recognize when your code needs improvement.
I completely feel for the situation you are in. I started learning programming basics in my free time while I was still working, and then 3 years ago decided that I wanted to go back to school full-time. I had already earned my bachelor's, so I went back to school for my M.S. in Computer Science. I did not have a Bachelor's in CS, so I had to start out taking all of the required courses that a BS would take in Computer Science. I thought I knew a little bit about programming (since I had done some programming in my spare time), I was wrong. My first quarter, I was completely overwhelmed. I ended up not passing Java I, and had to retake it my second quarter. I then eventually started working a job as a graduate assistant. What "kept my together" was my interest in the subject. When I was finished with assignments, I would often go back and refactor them and look for ways to improve their readability and scaleability. I would recommend (in addition to the excellent books that Junilu recommended) Code Complete 2. This book isn't too expensive, and can be purchased in the Kindle format (how I have it) and gives lots of recommendations on ways to program better.
If I can give you any encouragement- it does get easier. The things that you thought were difficult (like implementing jUnit with TDD) you will look back and laugh. Keep practicing- it's like exercise- it hurts in the beginning, but you'll rise to the challenge