Even though this blog post specifically talks about Java programming language, but some general ideas found in the replies apply as well to another programming language.
The original poster asks:
“I’m currently taking a course called Advanced Java Programming, which is using the text book Absolute Java, 4th edition, by Walter Savitch. As I work at night as a security guard in the middle of nowhere, I’ve had enough time to read through the entire course part of the book, finish all eleven chapter quizzes, and do all of the assignments within a month, so all that’s left is a group assignment that won’t be ready until late April. I’m trying to figure out what else to read that’s Java related aside from the usual ‘This is how to create a tree. This is recursion. This is how to implement an interface and make an anonymous object,’ and wanted to see what Slashdotters have to suggest. So far I’m looking at reading Beginning Algorithms, by Simon Harris and James Ross.”
Some informative replies:
–How about the obvious…
How about writing code????
Learning the theory is good, but writing code is very important..
–Re:Do we really want him writing code?
I agree with you about the shitty code out there. I simply can’t agree with anything else you’ve wrote.
Why do you assume that only people with Computer Science background should be writing code? Your post also just assume that because he is a security guard, that he just should write code that would never see the light of the day. That’s plain stupid you know.
The submitter already told me two thing with his article. First is that he truly loves programming, and second is that he is able to self study any language without the need of a course where he could ask many questions about issues he didn’t understood.
That’s more than I find in many people with a computer related education. Your computer science background can teatch you important concepts, and the right way to do things. It can be a valuable and important background. It can’t teach you how to be creative with your algorithms, and how to be smart enough to write complex programs.
– Re:Do we really want him writing code?
The other thing an education in C.S. does not give you is the social aspect of code development, i.e. working in a team. In practice, a lot of coding is having you advocate and defend your design, and/or conform to others’ designs when it doesn’t go your way, and working with large pre-existing code bases.
Schools are aware of this and they do try, but IMHO it just can’t be done for real in that setting.
Getting involved in an open source project over a significant period of time is a better way.
– Re:Do we really want him writing code?
Although I get what you’re saying, I think it’s a bit harsh too. Everyone starts somewhere. Everyone writes crap code when they start. The key thing is, the more you do it, the more you learn, the better you get.
I don’t know whether there are any other self-taught coders such as myself who can back this up, but personally I’ve found that half my learning was done before I even reached university – learning that code isn’t about cool routines. It’s an operation of keeping things simple, making it so you need to think the smallest amount to understand what’s happening. That design is paramount. CS has so far been (a still enlightening) mathematical cherry – but on a cake of practical experience I had prior to university.
So I suppose what I’m saying is that, given enough time and experience I would not say CS is strictly necessary. And at the same time, in some cases, CS as a course actually does a whole lot less than what people think it does. You need to expand beyond the academic experience to be useful, even if you do have CS
– Re:Do we really want him writing code?
What a load of tosh. So you need a CompSci degree to be a professional coder ?
I’ve just finished a 9 year employment with a company that was based not on degrees, CVs or other paperworks, but on the basis of a successful 6 week freelance project back in 2000. I should point out I’m completely self taught, no formal training whatsoever.
Coding has nothing to do with language or syntax, but upon having an analytical mind. Breaking down a problem into it’s bare elements, and knowing how to make those elements work together is everything. There’s plenty of CompSci grads who can parrot off the functions and procedures available in NET or JAVA, but haven’t got the first clue how to apply those to the problem at hand.
– Re:Do we really want him writing code?
Right! Just because you have a degree doesn’t mean you magically crap daisies and good code. I’ve met plenty of programmers with advanced degrees in Computer Science who couldn’t tell me how to implement a linked list, or when one would be an appropriate choice over a hash table. I’d take someone with a high school diploma who enthusiastically engages me in the interview and actually thinks about my questions over some guy with a master’s in CS who treats the interview like an odious chore he has to perform with me as an obstacle between him and a fat paycheck. Too many colleges have given complete jackasses a piece of paper for that paper to hold much value in my eyes.
So yeah, go forth and write code wherever you think it will be cool. Work on an open source project or two that you can point me at, or find a company with an entry level programming position — there are plenty of them around! Do it because you like it and you’ll do all right.
– Re:Do we really want him writing code?
I would say that he is dong his best to rectify exactly the problem you raise. He seems to be well aware that simple knowledge of the language syntax is not enough to qualify to use the language, and is asking how he can rectify his lack of experience. I give kudos to him for being as aware of the problem as this, and more kudos for seeking out a place like /. to learn and to ask the question he has done.
I would say that I am more self taught than academically taught – nearly forty years ago. And I have shipped a lot of systems used by a lot of users by choice, so my code cannot be that shitty.
– Re:How about the obvious…
How about writing code???? Learning the theory is good, but writing code is very important..
I agree with this… pick a project, dream up some application and build it. If you have something in mind that’s great but if not just do something simple like maybe building a tick-tack-toe or checkers game, or building a database application for your DVD collection or something along those lines. It doesn’t have to be an app that you’ll use but getting your feet wet with a real project is invaluable to the learning experience.
– Re:How about the obvious…
If you can’t decide on a project, yet. I’d recommend two books: Java After Hours (perfect for a security guard) and Wicked Cool Java. They’re both the same basic format, each chapter exposes you to a new library. Wicked Cool Java covers more ground, Java After Hours is a little more detailed for each project.
– Think about what you want to do
It may be too early in your education to know what you want to do in your career, but I would start looking in to areas where you can specialize. Client/server architecture will always be a skill that looks good. If you want to go this route, look into learning Java Enterprise Edition. UI design is good to know, but with abundance of WYSIWYG editors that are available now, writing UIs is becoming less of a skill. UI design theory is still pertinent even if the coding skills are going the way of the dodo. Some other skills that will come in handy are writing web services, database interaction (with JDBC and JPA, both good to know), and multi-threading. I would also recommend the book Head First Design Patterns [amazon.com] to get started on learning how to design software (as opposed to just writing software).
I would agree with what a lot of people have been saying, though. The best thing that you can do is put what you know in to practice. Start out writing a small application for yourself. Write unit tests.Do some code coverage analysis on the code and make sure you are completely covered. You can start with Cobertura [sourceforge.net] . Get to know what APIs are available in JSE. I’m assuming that in an academic environment you are using the latest JSE (6), so I would also look into familiarizing yourself with JSE 1.4. There are some major differences between 1.4 and 5 (and not a whole lot of major differences between 5 and 6), and if you are working on legacy code in the future, it helps to know what differences there are. Write an app in whatever you are used to using, write it again with JSE 1.4. Check out an open source project and debug it. Get code coverage on the project and write tests to cover more lines of code. Most OSS projects would be happy to integrate tests that increase their code coverage. Look through the bugs that have been logged against the project. Pick something small, fix the bug, and submit patches. Get familiar with build systems like Maven 2 [apache.org] or ANT [apache.org] . That should keep you busy until next semester.
– What’s next?
Program something for real. Be goal-oriented. No amount of working through exercises teaches you programming for real.
– Re:How about gaining experience?
After that, find an open source project that interests you and try to participate. The comments and help you get from more experienced members of the team (code reviews, really) will greatly improve the quality of your code. It’s one thing to write code that works, and another thing altogether to write code that is maintainable and efficient. I’m making an assumption here that you can find a project willing to take the time to help you as you help them.
– Implement some of the exact same things in C
While I do regularly program in languages like Java that have automatic garbage collection, but in my experience you need to actually do some time in a language(C being the most common) that does not do this for you. While this is anecdotal, I’ve found that people who have never actually programmed in a low level language tend to regard object allocation and deallocation as “magic” and thus write poorly performing code.
By implementing a lot of the same things in C you can get a much better feel for what is actually happening underneath the covers.
– Re:Implement some of the exact same things in C
Another layer of abstraction is easy to dismiss as encouraging sloppy thinking and “magic”, but C encourages this in the same way with anything allocated on the stack. Dynamically typed languages get some heat for not forcing users to decide on the type of their variables. By writing the same program in many different languages, you get a much better feel for what is part of the problem itself and what is part of the stuff you need to do for the computer. From hand-crafted machine binaries (preferably avoiding any operating system “magic”) to a quick shell script, it’s all a question of where your problem space is. I’m all for learning multiple languages, but abstraction is really a good thing, so I would add “implement the exact same thing in Python/Ruby/Lisp” to that as well.
– Best way to learn:
Pick something simple to build (i.e an application) and build it. You’ll learn huge amounts just from filling the gaps in your knowledge in order to achieve what you want.
– Re:Best way to learn:
Anonymous Coward :
One thing that us programmers often fail to suggest to newbies is…
Learn project management skills!!!
You may be able to write some of the most elegant, stable, and fast running code on the planet… But if you have a problem doing the following
– Making a schedule
– Estimating time to do tasks
Your personal programming projects will rot it “never-gonna-finish” hell. Take it from first hand experience. Oh yeah, while you’re working on your project management skills, now would be a good time to solidify your code commenting skills. You (and everyone around you) will love you for it.
– Learn something about embedded!
Buy an Arduino or something similar (msp-430) and see how much work it is to actually toggle a LED at a certain frequency, or drive an LCD connected via I2c or something. It’s a whole new world. You’ll have to learn C (probably) and maybe a bit of assembly language.
Linux journal had a nice introduction article [linuxjournal.com] on embedded programming.
I’ve been doing embedded development work for the last 20 years, and am still enjoying it. It pays pretty good, and you’ll be far less interchangeable with someone else than your typical Java programmer.
– Find an itch and scratch it
Write a program that tries to help to solve one of your everyday problems. It mustn’t be the best in general, but it should be as good and as well suited for your own needs as possible. It could be something for you personal finance tracking, something for entertainment, a better interface for data that you can download from the web (dictionary? thesaurus?). The most important thing is that the problem must be interesting enough for you to finish the task so you should be able to at least get the software to a certain level of usability. Then write documentation for it.
– Effective Java
Effective Java [sun.com] by Joshua Bloch. Will give you some deep insights into the workings of the language.
– Re:Effective Java
I’d second this. (And would have modded it up had I had some mod points.) Even a beginning developer can draw some very useful information from Bloch’s Effective Java. While you probably won’t understand a large part of the details, reading through it will help give an idea of things to avoid and things to use. By going through the book, even if you don’t remember all the details, hopefully enough will stick so that you can reference back to the section if you ever have questions regarding a particular detail.
– Read more, code more
Read more if you want, MIT’s open courseware is great, donate if you can, i do. they are good refreshers.
There are pretty standard student projects, (like game of life, notepad, msg servers,)
You might want to move into more advanced topics, like javax or concurrent stuff like RMI
Algorithms are great to learn but sadly Ive had little chance to use em in real work, would’nt put too much stock in them for returns.
In any case, any algos you need most likely you will learn on the job, if something slows too much.
They are however fundamental if you want to be a proper engineer.(In my opinion anyway)
If you want real world experience, go look at the freelance websites and just copy down the specs and attempt yourself.
Dont need to bid, but these provide a snapshot of EASY projects in real jobs.
I also have some 100% real world work projects assigned to me if you want to do for free…….. just kidding
– You’ve got one third of it
In my experience, there are three things you have to do when learning a new language, after you get the syntax:
- Learn some common algorithms, and how to implement them in that language. Sounds like you’ve got yourself an algorithms textbook, which is great. Just make sure you’re understanding why they work, not just going through the motions.
- Learn the standard library of the language. Obviously Java’s is enormous, and there’s no way a human being could possibly keep it all in their head, but you should check out the Java API [sun.com] and get a sense of, “what things are available to me in case I need them?” Java in particular makes it very likely that something you’re trying to write already exists in some form, and there are a lot of programmers who waste valuable time reinventing the wheel every day because they don’t know enough about the standard library (the flipside though, is that, just like algorithms, you need to make sure you know what you’re using. Way too many programmers throw in a java.util.LinkedList without knowing what the hell it is)
- Experience! Write real code! This is the most important thing of all. The best experience comes from working in a group on a larger project, although of course that’s not always possible. Try writing some larger programs on your own, making sure you keep your good design principles (use interfaces, abstraction, modularization, etc.) from start to finish. When you feel you’re ready, there are plenty of open-source projects on Google Code in Java: download one and tinker with the source until you understand it. Hell, join the project if you’re ready.
Good luck, and godspeed.
– Re:You’ve got one third of it
The algorithm textbook that he is using is a great read provided he does the exercises at the end of each chapter. The great thing about the exercises is that they challenge the reader to tackle the algorithm from a different perspective. So, if an algorithm is demonstrated using a recursive method, the book asks the reader to rewrite it using an iterative method which is an excellent way to learn.
I actually read halfway though the book skipping the exorcises, figuring they were too easy and I was wasting my time. When I started doing them, I realized how much I didn’t know so I started back at the beginning and filled in all the gaps which really expanded my knowledge on the subject.
– Other Things…
My assumption is that at some point you’d like to try to make a living as a Java developer. If that’s not the case, please disregard this post.
How much do you know about databases? If the answer is nothing, you’ll want to get up to speed on at least basic SQL. Pretty much every Java project you ever work on in the business world will make use of a database. 80-90% of the syntax is pretty standard from database to database, although nearly every professional Java project I’ve worked on used Oracle.
While not every Java project is a web project, it wouldn’t hurt to have a basic understanding of HTML, CSS, and at least one web server commonly used to host JSP such as Tomcat or WebSphere. Even if these pieces don’t end up being your job, the basics are helpful.
There are all kinds of popular Java frameworks meant to solve different problems. Try to get a basic sense of what’s out there and what each of the leading options is good for, e.g. that something like Hibernate is used for data persistence and something like Java Server Faces is more of a presentation technology. (Or whatever’s popular now; I haven’t worked a Java project in a few years and I’m starting to get out of date.)
Probably you also should start to learn one or more of the common Java IDEs. Eclipse is near ubiquitous, but you may prefer one of the other options.
The best stuff to read after you think you’ve got the basics are anti-patterns which show you what not to do. A lot of that stuff can be quite eye opening to read. One of the best books on that topic is Effective Java by Joshua Bloch. Also, search the web for sites like this one: http://www.odi.ch/prog/design/newbies.php [www.odi.ch]
Also, not a book per se, but if you do write some code it’s possible to learn more by analyzing the code with tools like findbugs [sourceforge.net] which will show you a list of things wrong with your code. Even professional programmers can learn something from these kinds of tools.
– Java Puzzlers
This might be a bit heavy for somebody as new to programming as you, but Java Puzzlers [javapuzzlers.com] is a great book for Java devs of all skill levels to read. It’s a series of small programs that screw up in ways you wouldn’t expect, often related to bizarre gotchas in the design of Java itself. Newbies might not understand every puzzle, but generally it’ll give you an appreciation for the fact that no tool is perfect, and insight into what sort of bugs you might find yourself writing in the real world.
– READ Code
Grab a piece of open source code that interests you and walk through it. In fact, in contradiction to what some others have posted here, it’s better to read other people’s code -first- before starting to write it yourself. You’ll end up with a much better appreciation for the language and the structure of a program.
You want to look for both ‘patterns’ in the small (“What does this little chunk of code do?”) and structure in the large, e.g. class layout, etc.
Too many people out there produce ‘write-only code’, just check out http://thedailywtf.com/ [thedailywtf.com]
A programmer without sql knowledge is like a fish out of water and not very likely employable. SQL knowledge
and working with databases is a must.
After Learning Java Syntax, What Next? | Slashdot