I’m a telecommunications major who has taken the two intro programming classes as well as a data structures class. I’m not sure if I want to do networking or software development. Although I know several languages and am able to throw together quick and dirty solutions I don’t have a strong theoretical backround. What topics would you recommend I learn to become a better developer since I already have the skill of looking things up on google down to an art? Any resources would be appreciated.
See MIT's Open CourseWare (http://ocw.mit.edu). Also see Berkeley's podcasts (http://webcast.berkeley.edu/course%5Ffeeds.php). And Stanford's (http://see.stanford.edu/see/courses.aspx [thanks @GR1000]).
IMO, work experience and/or a degree are the only things that matter.
Either you have a piece of paper that says you can do something, you have experience (and hopefully supervisors/coworkers who will be references and say good things) doing things, or you have both.
I would look into contributing (or starting) an open source project, myself. I have been looking, but haven't found anything that really suited me quite yet. If you want to read up on things first, this question has a good list of things that people weren't taught in school.
The best answer is to take a job as a programming intern. Many companies, including the one where I work, love to hire people and pay them almost nothing to be programmers. Do this for a year and you've written your ticket to work just about anywhere else. It's the best way to break into programming.
I have a degree in Journalism and my wife has no degree at all and we've both been programming professionally since the mid-90's.
When I started looking for a programming job I sent my resume to dozens of places before anyone bit. A small computer bureau hired me for the same money I was making working in retail (not very much at all). The boss told me, "Work for me a year and you can double or triple your salary almost anywhere else in the country." That totally worked.
I have many, many friends who've broken into programming using this model.
Start small - work a contract for less than what other people will take. Work on a few open source projects. Create a blog about your programming experience.
Just get experience. The primary thing that matters in this business is experience. Just get some and you'll do great. There will be doors closed to you because you don't have a CS degree, but there won't be very many and you'll still be able to make a great salary. I don't feel like I'm missing out on anything because of my lack of a CS degree.
Go to a half-price bookstore, or a similar establishment, and buy a cheap computer science textbook, such as data structures, algorithm analysis, or even just a few language reference books. Then join an open source project on sourceforge. There are plenty of open source projects that would love to add enthusiastic new developers to their team. Also, if you have time start a pet project of your own that you can continuously work on...the trials you will go through trying to figure out how to design/implement it are some of the best early lessons you can learn.
As far as theory goes there are a few areas that have really helped me:
- Design patterns
- Object Oriented Programming
- Functional Programming
- Unit Testing (and test driven design)
I'd recommend looking into these (Wikipedia is great) and also look into a programming puzzle site (Project Euler is my favorite).
Write code. All the theory in the world won't help if you have no experience. Open source projects are a good way to get started. Even better you maybe able to find someone to mentor you. It also helps to have some domain expertise. If you want to write accounting software, you had better know accounting as well as software. Finally be prepared for a lifetime of learning. Software reinvents itself about every 5 years. I am not saying that everything you learn today will be obsolete in 5 years, but there will be newer, usually better, techniques and of course much more powerful hardware and software to build on.
I would recommend looking at a minor in Computer Science, or at least something closer to the field you want to work in. That should give you a taste of the material without forcing you to dive right into another degree. However, if you are really serious about the field and want to pursue a job in Computer Science go for the full Bachelors degree. I know Echostorm's comment probably sounds horrible, but finishing school (at least in the US) is critical, even if the degree is not related to the field it shows dedication and commitment. With telecommunications as a major, you may even be able to snag a position with a company that specializes in telecom software too.
That said, I will echo what others are saying: experience is key. Get your head into code as early as you can, and learn to learn. In our field the ability to learn is an insurance policy worth its paper equivalent in gold. How do you get a job without experience? Easy, tell them up front that you're looking to learn and you'll take anything they offer you. Now, that won't make you rich but the experience you gain will be worth the investment.
I did that very thing whilst in college, and took a position doing far more in depth work than I do now and I made a fourth of what I do now as far as salary is concerned.
Do you like hardware, hands on, and getting paged at wee hours of the morning? Go with networking. Do you like staring at a puzzle or breaking a problem down into smaller parts? go with computer science.
I skipped the degree and went into business myself, years ago. I'm still trying to determine whether that was a smart thing to do. :) As most have said here, experience is key, and being able to sell that experience is also important. A degree is just a quick and dirty way to gain some of that experience, sort of like buying gold in a MMORPG. That said, in some games, everyone expects that everyone is doing it.
I like the suggestion some made of getting involved with an open source project. By doing so, you can gain some important experience in the relational aspect of software development (often the more complex and irritating factor!) Sample a few projects and you can start to develop a nose for code smell. But before you put it on your resume, be sure that you have contributed some substantial portions to the project and that your name appears in the credits somewhere.
The compiler course is a great 'theory' feather to put in your cap.
Stackoverflow: learning to write a compiler
It will teach you how to work within a restricted environment; ie: using registers, memory management, etc.
Maybe work with some linked lists, arrays, b-tree's, all the various container classes...
Get intimate with SQL as well.
Get experience by writing code. This career field requires constant learning. Getting a degree while nice, isn't the end goal. It's just one way of starting. Expose yourself to as much as you can and don't worry about not having a degree in Computer Science. I've been learning about programming for over 28 years. I haven't run out of things to learn yet. I also don't have a degree.
Being able to look something up is not a skill. It just means you aren't an idiot.
Get a comp. sci. minor, and orient your upper-division courses towards formal languages,, algorithm analysis and computational complexity/computability questions.
Those are the key theoretical aspects which are hard and you will have issues learning them from a book(unless you're a hardcore autodidact with a good grasp of mathematics). Pretty much everything else can be picked up or will be taught in lower-division courses.
A major difference between a computer scientist and someone who can bang out code is the awareness of the theoretical aspects of computation and the limitations of machines. A good computer scientist can apply that theoretical knowledge.
Read. Read a lot. not just all the oh-so-popular software blogs - but read seminal and definitive development books.
these should be language specific books, process books, testing books, general business books, etc.
I can provide my own list of favorites, but I think there are threads ont his site with lists of books.
You want to be aware of many of the "best practices" and you want to know a lot of the current trends. (Though you should not be too quick to jump on the bandwagon of all these silver-bullet processes and buzzwords.)
Learn about a wide bunch of stuff int he industry and take time to learn a few subjects very deeply.
The goal "...to become a better developer..." requires a major value judgment: is your intent to become better at making a living as a developer, or to become better at making solutions?
Many people might think that there is no difference between the two, but the industry is unfortunately well-populated with people who obtain a substantial paycheck while making a huge mess for others to eventually clean up. As a contract consultant I spend much of my time doing that clean up, which often puts me in a thankless position--I get to tell the business person who hired me that they spent all that money over the last few years paying someone to make a massive mess that will now cost a whole lot more for me to clean up.
So, if you want to merely make a living and don't care about quality or the legacy (mess) that you leave behind for your peers, then read a book or two. If, instead, you want to truly contribute value, then please consider a more extensive educational program.
However, I do not necessarily recommend an institutionalized education (typical college or university), since many are lacking. There are a few good engineering schools where you can actually get a decent computer science degree, but most schools seem to still pay lip service to CS. Look for a degree program that requires you to write lots of programs of different kinds using many different tools (languages, OS, hardware, etc.).
You may do better under self-study, if you have the discipline to truly be thorough. You can check out the classic textbooks at the library, or buy many via used book outlets. But probably the most important thing that I can suggest is the careful consideration of your focus.
You will find that most computer books are about tools, such as the "Learn X in Y Days" kind of book. While tools skills are necessary, they are not what is important. Instead, look for computer books that address "how" and "why" and "when" rather than just "what". In other words, look for books that will teach you about design and style and quality--they tend to have little to do with any particular tool, and they will tend to last you a lot longer in your career.
Consider this: Leonardo da Vinci did not do a "Learn to use a paintbrush in 21 days" book. If I bought such a book, and I spent the 21 days diligently, there is still no way that I would ever produce something comparable to his "Mona Lisa". Likewise, the carpenter that framed your house knows a lot more than just how to swing a hammer. And you will need to know a lot more than just how to create a database table in Microsoft Access. Knowing when, why, and how to apply the tools well is the real skill, and you won't find that in a typical degree program or a typical computer book.
Meanwhile, watch for whether you have any difficulties applying what you learn to any particular tool. If you have a real "knack" for this computer stuff, you should find that you can use most any computer-related tool easily. If you struggle too much, then maybe you should consider retargeting your goals--just as I have given up trying to compete with da Vinci's paintings.
Being good with computers does not make oneself a better (more valuable) person, nor does a lack of such talent diminish oneself. If you desire to be a "da Vinci", then pursue something like the suggestion above. If you don't, or if you don't have that much talent or interest, so be it--the world needs lots of those, too. Da Vinci did nearly everything exceptionally well, but most of us need to pick just a few things and pursue only those. Please, just be honest with yourself and with others--that does make you a better person, IMHO.
EDIT: I must respectfully disagree with some--random experience does not grant ability, it is more likely to ingrain bad habits. Simply going to work somewhere, with no discipline, study, or guidance, is likely to be disastrous, as I have repeatedly seen among my peers. Please don't do that to yourself, or to those who will have to clean up afterwards.
Smartest Software Engineer I've ever worked with is a Physics major, who naturally migrated to Software for the intellectual involvement and the paycheck.
If you are good enough, and become a big enough expert, the degree won't be a huge detriment.
Not often the case, but it just means that if you are smart enough and work hard enough, doors can open.
Read Books, Blogs, Forums, and get involved! Pick a language and start learning.
I'd like to think of software development and computer science as two related areas.
Software development is engineering. It's about finding the best practical solution that you can build given your current constraints (time, money, knowledge, computing power, ...). It can be gritty at times, but some high-level view is necessary in order to avoid getting lost in the details.
Computer science on the other hand is a pure science. If it can't be proven, it's worthless (usually). You want definitions, proof and occasionally some code that does something ('though very rarely).
Knowing one of those two can help with the other, but neither of them is a requirement for the other one. They just aren't as closely related as one might think. With the right amount of curiosity and willingness to learn one can achieve a lot more than with just a computer science degree.
Some typical software development topics are sometimes not even taught sufficiently in universities, such as OO-design, software architectures and similar stuff. But if you really want to get down-and-dirty with software development (as opposed to developing the next proof-generator for some formal methods where you need pure computer science) then they are far more important than the rest of the computer science courses.
Some of the basics that I personally think are worth knowing from the pure computer science courses:
- What is the big-O notation? What does it mean? How can I find the big-O of some given methods?
- What is a turing machine? What is computable, what isn't?
- What is the halting problem? Why is it interesting?
- Just how powerful are regular expressions?
- What possible approaches are there to formal verification of computer software
- Knowing some basic statistics
Those are the computer science parts that I find useful in day-to-day software development. But all of these together are nowhere near as important as the engineering aspects above.
The Art of Computer programming by D E Knuth is pretty good. It discusses the fundamentals in an in-depth, technical fashion. There are three volumes:
1) Fundamental Algorithms. Introduces a hypothetical computer called MIX (in which all the example code is written), discusses data structures, memory allocation and garbage collection.
2) Seminumerical algorithms. Discusses the way numbers are handled in a computer, with enough information to write your own big number library. About half of it is about pseudo random number generators, but it does not describe the Mersenne Twister(the current champion). You may find it interesting, although it is less likely to get you a job, so this volume isn't really necessary.
3) Sorting and Searching. Two topics which are important enough to justify half a book each.
The biggest problem with having no formal education is it's really hard to identify your weaknesses. You usually have no idea where to start to improve yourself and cluelessly attack to random sources. Schools are good institutions to perform this exercise on you. They can tell you where you need to improve on so you can better focus your efforts on the right area.
The same can be achieved out of school, learning from your mistakes but demands too much practice and takes too much of your time. It works as well as institutionalized ways, if you're willing to spend that time.
Personally I enjoy spending time on CS problems as a hobby, so the time I spend really isn't an issue. If that's the case with you, you can work it out any way you like.
I'm in my 30s. I have no degree; I left school during the dot com boom. I'm slowly working on an unrelated bachelors. Having no degree has made it much harder to get interviews. Having skills I can socially chat about, and having work or workstudy experience that's relevant was a ticket to whatever job I could get an interview for.
That said, I'd suggest reading two types of references.
First, read a book or two on Software Engineering. It's the art of writing easy to read, easy to maintain code. The Pragmatic Programmer and Code Complete are two great books here.
Second, read up online or in books on some of the theory you may have missed. Since you can already write programs, skip to reading about Data Structures.
After that, a course in Algorithms would probably be useful for deeper understanding of how some things work behind the scenes. Most other theory skills require specialization; networks, operating systems, graphics, artificial intelligence, even web development; after the data structures and algorithms courses, the field diverges pretty quickly.
After the core knowledge, experience - specialization and practice - might be more important than books, and you're only four books in. Read away, and good luck!