Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

The problem here is that "I don't know what I don't know".

How can I fill in those gaps? What is it that a computer science degreed person will know that I don't?

Note: This isn't a personal question. I'm not asking you to read my mind so you can tell me where my knowledge is lacking. I'm really asking "Where/how can I get the knowledge a computer science degree would give me, without getting one?"

Example: I don't know anything about compilers, but I understand that comp sci majors often are required to write some sort of compiler. This seems like something that would be useful to know. Etc.

share|improve this question
    
What is "the knowledge a computer science degree would give me" a proxy for in your mind? I assume that if I referred you to study dance or child psychology you'd respond with a big old "WTF?!"; you probably have an actual goal in mind. What is it? Knowing the desired outcome will allow us to provide better advice on getting there. –  HedgeMage Jun 5 '11 at 5:44
1  
@HedgeMage: Well as I understand it (and of course my understanding may be flawed here since I don't have first hand experience), a Comp Sci degree gives you a very solid CS theoretical background with which to tackle and learn the rest of what you need to do actual work in the real world. I think I would learn things much faster if I had this knowledge. Terms, theorems, concepts, algorithms, etc. Things you would learn in a Comp Sci curriculum. –  Richard DesLonde Jun 5 '11 at 5:56
1  
Ironically, there is another question on Programmers right now that makes it seem as though a CS degree didn't teach the OP what I think it does: programmers.stackexchange.com/questions/81624/… –  Richard DesLonde Jun 5 '11 at 5:58
    
@hamlin11: am I missing something? I don't get it. . . –  Richard DesLonde Jun 5 '11 at 5:59
    
One of the things you may be overlooking is that completing a CS degree demonstrates, both to you and to your potential employers, that you can start a long, difficult project and see it all the way through to the end, in the face of lots of temptation to chuck it and go do something more immediately profitable and more fun. –  John R. Strohm Jun 5 '11 at 11:30
show 3 more comments

10 Answers

up vote 19 down vote accepted

Online university curricula.

The most well-known online curriculum is MIT's OpenCourseWare. This link goes straight to the EE and CSE courses.

A lot of information about university curriculum is often on the public web. For example, you can get to all of the University of Washington's CSE course pages. Many of these will have syllabi, posted homework problems, information about required textbooks, etc.

share|improve this answer
    
Those are great courses from MIT. Helped me quite a bit with some ECE. –  Chris Jun 5 '11 at 11:40
add comment

Education Gap

Your question reminds me of the frequent cold war obsessions with things like the bomber gap and the missile gap where the United States was sure its rivals like the Soviet Union had an industrial or technological edge in one or more areas. Certainly Sputnik was a proper shock, but once the space race began, there were some significant accomplishments that showed some of the perceived gaps were not as big as they appeared.

In terms of your gaps I would challenge you to have some faith in what you know, but more importantly in what you can learn. If you can create a consistent determination to compete and make mistakes on the side of learning too much, I think that at worst, you will be facing a high class problem.

Can You Learn On Your Own?

Yesterday I had breakfast with a friend who has a PhD and has frequently been adjunct faculty at a university near where we live. His take was that many of the things he teaches (mainly digital signal processing and digital communications) could be learned independently from books. However, the pressure of the either getting a good grade or not getting a bad grade was an important motivation to stick to the hard task of learning the entire material at the highest level. I proctored an exam for him once. No one finished early, many looked pretty stressed. But I have also worked with his former students who say they learned more and used more from his classes than most of their other classes.

As he described, I have always found it helpful to have the structure and motivation of the school situation going. Beyond the motivation, it is good to have an expert selection of closely coupled topics that has some cohesion. To go a final step, and not all professor do this, it was extremely helpful to have professors who had an iterative / incremental plan for learning that presented less difficult material leading toward more difficult material and required frequent term project deliverables in much the same way a work project should.

Is the Degree Really An Impossible Goal?

University education is a great and generally well rewarded goal, particularly the undergrad engineering degree. Unless there truly is an impossible obstacle in the way, make the Computer Science undergrad degree your goal. Talk to your friends who have degrees as ask if they had times when they thought it would be impossible. You may find a few who tried and failed, then went back later and succeeded.

I realize that not every community has access to a good CS department. Most people must work and classes are expensive and getting more so. There are certainly many regional differences. In some places,there is tremendous government support so that almost anyone who wants further education can get it for little cost. In other regions, education at all levels has high demand with low supply, so only the most competitive candidates can get it. There are sometimes age or other limits, and options like part-time re-entry to degree programs is unavailable or rare.

I admire the boldness of people who migrate from their homes to face unknown challenges. Certainly, getting a degree is not more difficult than this, although layered on top of migration, I expect it must be very hard, and sometimes enabled by pooling the resources of extended families. Conversely, migration may make the degree option possible, so if you have that urge, and can stay in a place long enough to finish a degree, it could be your opportunity.

Benefits of Continuing Education

Benefits from continuing education, informal or formal may start sooner than you expect. All else being equal, if I were evaluating two candidates for a job, I would hire the most determined life-long learner whether he or she had a degree or not. Certainly someone taking courses one at a time toward a degree program would get my attention, even if the degree were years away. My feeling is that even a little college can open your eyes on some things. Even a free download from iTunes U of a Stanford or MIT course can give you a feel for the way academics define, discuss, and develop solutions to problems.

Some Specific Ideas About What Matters Topic-Wise

D. L. Parnas and Edsger Dijkstra are two Computer Science legends with ideas about what you need from a Computer Science program, and by extension perhaps, what you should fill in to assure there are no gaps in your training.

Parnas specifically identified compilers as something that was over-emphasized. My undergrad included a semester of compiler construction that was interesting and I think had some merit, but I can't say it had much direct benefit to my career thus far (which is mostly embedded systems). A prerequisite course called "Structure of Programming Languages" was much more valuable. It included information about parsing, use of Backus-Naur Form to formally represent language syntax, attribute grammars, abstractions required to implement language features to permit things like expression and flow optimizations, allocation of parameters and local variables on the stack in a unit activation record, and other stuff that did help occasionally in writing efficient code, but probably most often in understanding what showed up in a debugger often after a crash dump occurred.

Parnas was also very down on what might be described as emerging topics, even for Masters level work that is often considered appropriate ground for research. He was big on science and math, on software engineering more than computer science, and on picking things that were valuable 20 years ago and would be valuable 20 year from now. In someways, Parnas himself both reinforced and damaged this argument because even something as fundamental as software design. Parnas was a pioneer in objected oriented precursors, and helped evolve from structured to object oriented. Design would have been one of the long term value topics he advocated, but he helped obsolete much of what you would have learned twenty years ago, and of course, in twenty years we may still have objects, but our paradigm will probably be organized around some other design concept.

Dijkstra had a paper where he recommended that computer science students not do any programming until the second year of their degree because they needed proper formal groundwork before they could begin writing code in a way where bad habits would not be formed.

Robert Martin has some ideas about software that it should or could be more like accounting which teaches at the undergrad level what are called Generally Accepted Accounting Principles (or GAAP). Martin doesn't think anyone teaches a software equivalent (except he is trying), so software GAAP is probably not a gap that specifically happens from lack of a degree.

share|improve this answer
add comment

I've learned more about programming from Math and Physics majors than I ever did from anyone majoring in CSE. Of course the physics majors I work with are pretty top notch.

Theory is important, but mostly what you need is training. Whatever you do, keep at it, year after year. You can apply the years of experience to other projects or other disciplines as needed.... I majored in Chem, but now am picking up code faster because of the overall scientific training (and now I can appreciate programming more since it makes what I do easier).

The trick is keep at it and find what works for you.

share|improve this answer
add comment

CS theory isn't as mysterious and academic as you may think. I learned it by reading some good books (for algorithms, you can't do better than Knuth's The Art of Computer Programming), learning lots of programming languages (the only way I know to grok language design, within academia or without), and as for complexity theory, I'm not really sure how I learned it, I just kind of absorbed it along the way at some point.

That, I think is an important point -- I spend a lot of time talking to people who are smarter, more experienced, and more knowledgeable than myself. It's amazing what I've absorbed over the years, without really trying to.

share|improve this answer
add comment

The difference between studying at university and studying for yourself is, that university

  • brings together people interested in the same subject
  • provides structure and orientation on your path to knowledge

That being said, you can quite easily compensate it, by

  • networking with other people interested in the same subject (participating on stackexchange, taking part on open source projects etc.)
  • having a look at online curricula (or even better, online summaries of offline curricula). You don't really have to sit through them, just really get an idea of how they are structured and what they cover and then work yourself through it any way you seem fit

Oh, and personally I suggest this lecture. IMHO, this is some really good stuff.

share|improve this answer
add comment

A simple answer is program. Write code. Write open source code. Write phone programs. Write whatever you want so you can show your knowledge. Write code that you are interested in to encourage you to fill in the gaps in your own knowledge.

Being a good programmer isn't about the degree or your certificates. Its about being able to write good code. The best way to learn how to write good code is to write code. Have to maintain it. Rewrite it. Have someone else look through it and see if they can understand it.

share|improve this answer
add comment

As you posted in Programmers site, I assume you wanted to get some direction to become a programmer. Degree/curriculum are means with which you reach your destination and not the destination itself.

Just because any one completed a curriculum it does not mean they mastered it.

In order to fill gaps the goal here in my opinion is the following. Gaps in knowledge can be filled easily if one has the following skills,

  • Problem solving
  • Creativity
  • Communication skills
  • Above all passion for programming

I know this is not exactly you wanted from the question, but I believe this is what you need.

share|improve this answer
add comment

If you live near a college or university, you could always ask the prof of upper division CS courses if you can sit in. I'm a professor and I always say "yes" to these requests.

share|improve this answer
1  
That's a great suggestion. Thanks. :-) –  Richard DesLonde Jun 5 '11 at 5:10
add comment

As far as getting a job, I would recommend two things: 1) Get several certifications: For the most part certifications should be part of your resume to help get you in the door for in person interviews. There is a lot of debate on the benefit of certifications. I myself have worked with several people who have several certifications but really didn't know anything about the certification subject. I have actually had the same experience from people with degrees from universities.

All in all certifications will help get your foot in the door. It is then your responsibility to prove you know what you say you know during the interview process.

2) Take part in open source projects: When a company sees that you take part in open source projects it shows a lot about you. First, it shows that you won't treat the job as just a pay check. It shows that you are passionate about and enjoy what you do. Second, it allows the company to see what you can do. They can see exactly what you contributed to the open source project and the quality of the code.

share|improve this answer
1  
Thanks Tanner. I definitely believe in certifications. They aren't a guarantee that someone is qualified (neither does a degree), but at least it shows effort and there is a better chance they know what they are doing. I don't think certifications usually have much to do with the CS degree domain of knowledge though. –  Richard DesLonde Jun 5 '11 at 5:10
add comment

Find an intern in your company (or a mentee) and offer to impart your knowledge or experience in industry upon them in exchange for their knowledge of things they have recently studied. Could be informal over lunch or scheduled.

-or-

Find out what boards and sites that upper division computer science students might frequent, and see what kinds of projects they are asking for help about. Try some of those on your own (you may need to reference some of the sites (or your colleague from my first suggestion) to get some of the background, of course)

share|improve this answer
2  
That's not a bad idea either. I am considering hiring a recent CS grad for an entry level position specifically so I can have the kind of arrangement you suggest. Thanks! –  Richard DesLonde Jun 5 '11 at 5:11
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.