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.

I recently read this article online and began to question my knowledge.

Now I went to uni(ish) and have a honours degree, I program in c++ using pointers but I wonder if i would have made it in Joel's class.

We had two programming modules but mostly I am self taught. So I want to know how can I learn the things mentioned in the article but without it feeling like gappy self taught knowledge without having to do another 3 year degree?

How can I go back to the real basics and learn it properly so I am confident in my abilities and dont feel I have a dumbed down modern degree knowledge ?

share|improve this question
7  
Step 1 on learning old-school. Correct Spelling. "I" refers to yourself. –  S.Lott Oct 20 '11 at 12:45
1  
"feel i have a dumbed down modern degree knowledge" - who cares? It's only old bastards who thinks it cares. Progress! –  marko Oct 20 '11 at 12:57
10  
@marko - He who does't know errors of history, shall repeat them... –  ldigas Oct 20 '11 at 13:01
1  
Step 2 - download a PDP simulator and start exploring this: simh.trailing-edge.com/software.html –  SK-logic Oct 20 '11 at 13:50
1  
@Skeith: That's what I love about English. The rules are the rules, and when you don't follow them, your question can look silly. Old-school precision counts. Trusting an IDE or an editor is not old-school. Old-school means checking your work very, very carefully to be sure that it's spelled correctly. –  S.Lott Oct 20 '11 at 14:30

7 Answers 7

IMHO, to have a successful career in Software Development you will need to constantly learn.

I have associate degrees in programming and networking and have been programming professionally for 12 years, this has required me to continuously learn.

My advice is to embrace it. Focus on improving the way you learn. I periodically read blogs, watch YouTube and MIT Open Courseware videos to refresh my knowledge and learn new concepts. In this way I've learned Advanced Java, Ruby, Rails, Git, JQuery, design patterns algorithms, Big O and over all better software design.

Checkout these learning resources

share|improve this answer

Some advices. I'm not saying it's the only way, but it'd definitely give you something to start with.

  1. Learn a functional language. CLisp or Scheme will get you started rapidly.
  2. Learn system programming. Get your hands on a free Unix and start hacking.
  3. Don't overuse your CPU.

The two first points are in direct relation with Spolky's article, where he talks about recursion (1) and pointers (2).

About (3), I got the idea while reading Guido Van Rossum on the birth of Python. At one points he talks about having access to 'only one second of CPU time per day'.

That should give you an idea of how much time he spent proof-reading and analyzing his code before even running it. I have been limiting my CPU usage for a few months now and can definitely feel an improvement in my writing skills.

share|improve this answer
    
What could someone do with one second of CPU time back then? Or did they have to save it up? –  Random832 Oct 20 '11 at 16:30

Since you already know c++, I would recommend learning a functional language. That will give you recursion, which is the other important concept from Joel's article. I have experience with Common Lisp and Haskell and can recommend both.

Also, don't worry about being self-taught. You'll probably have more things to learn now that you've left school than you learned while obtaining your degree, and that's normal in the industry. In fact, I was told by a professor freshman year that I wouldn't be taught anything useful because it would be obsolete in a few years. Instead, I would be taught "how to learn."

share|improve this answer
    
that the point, I feel we were taught something useful and not how to learn as "algorithms" are still a blurry subject but I have enough domain knowledge to get round that for now. Any advice on learning lisp ? –  Skeith Oct 20 '11 at 12:56
    
@Skeith, Advice on learning Lisp: Get yourself a good book and have at it. Here's the thing: even if you were taking a course that used Lisp or Scheme, you probably wouldn't learn said language in the lectures. You'd learn interesting concepts in the lectures, possibly even how the evaluator works etc., but it'd still be up to you to learn the language by doing the assigned work and maybe more. –  Caleb Oct 20 '11 at 13:15
    
+1 for Common LISP. I see the appeal of Scheme, but CLISP is a great language. –  Matthew Rodatus Oct 20 '11 at 13:21
1  
@Skeith: You may want to look at gigamonkeys.com/book. –  Larry Coleman Oct 20 '11 at 14:36

When I taught programming, one of the mental frameworks I had to put in place was that computers only do one thing at a time, in sequence. (Yeah, yeah, I know - pipelines, cores, blah blah. Parallelism is fine once you understand that computers only do one thing at a time, finishing one step before starting the next.) I had to teach that, by single-stepping little programs, because students tended to think since computers appear to be so fast, they must do everything at once.

Well now, thoroughly competent young programmers have a similar issue. It goes like this:

Nowadays, processors are so fast, and memory is so cheap, that nobody needs to worry that much about speed or storage.

So for example, when performance is discussed, it often comes down to measuring, and looking for bottlenecks. As if computation should be looked at as a swiftly flowing liquid, that sometimes gets choked at narrow passages.

The idea that the computer is doing individual little instructions one after another, with each one having a purpose, is tucked away in a mental closet, never opened.

So this is one old-timer who has single-stepped lots of code. That's one way we used to do what's now called "unit testing". If you do that, you understand in your bones what it's like to be a computer, being asked to do scads of things, often for very poor reasons. You wouldn't mind working hard - you like working hard, but you don't like your effort being wasted.

So there's more to being a Crusty the Clown of software than understanding performance, but that's a good place to start. I've tried my best to explain it.

It's worth pointing out that SO and its related forums is a terrific resource for sharing knowledge. I never had the benefit of that when I was younger.

share|improve this answer
1  
+1 It was a pleasure to read your post. I haven't heard the phrase single-step in ages. Thank you. –  Cape Cod Gunny Oct 27 '11 at 0:57
    
@Cape: As an alternative to the single-step picture, I've always been puzzled by Dijkstra's saying that one should start on a very formal basis, not writing anything without proving it's right. I do feel that proofs, even informal ones, are good, but as an introduction to programming it puzzles me. Anyway, thanks for your comment. –  Mike Dunlavey Oct 27 '11 at 12:47

Doing some embedded projects where you have to use assembler will give you more insight to where all the "modern" programming is coming from as well.

You will also realize that calling languages like Java and C# more modern than languages like Assembler and C. See them more like a fork. The development of Assembler and C is still going on today. They are in fact modern. Java was just created later and took lots of inspiration from them.

And also keep in mind that the purpose of Java and C# (enterprise applications, quick development of standard applications) is entirely different from the purpose of C and Assembler (close to hardware, speed, driver development).

share|improve this answer
    
One can certainly use C# and Java on close to hardware this is shown each and everyday on the Xbox and Android platform. I only really agree that we are unlikely to see C# be used for driver development ( although with the next release of Visual Studio we will see support for those developers ). –  Ramhound Oct 20 '11 at 15:26
1  
You're right, Ramhound. I have used JavaCard myself and it did provide an experience related to what you get when you use Assembler or C. The important thing is to get that experience - not which language serves as your vessel for it. –  Raku Oct 20 '11 at 15:33

Find a copy of the book "Software Tools" by Kernighan and Plauger and work through every example.

share|improve this answer

It's all about foundation. Once you have theoretical knowledge, it gets easier and easier to learn new languages and how to use them (which makes continuously learning throughout your career a ton easier). Obviously one way to do that is to go to school, but I'm sure you can still learn plenty of theory by reading on your own.

Basically, for every class that would be taught - read something on the topic! Get a general idea, and then choose what you care enough about to learn more about. Here is my highly opinionated list of topics:

  1. Programming languages in general. Learn about the different types. Imperative, functional, object oriented, even array
  2. Data Structures. Joel wasn't joking - it's incredibly important.
  3. Discrete math, linear algebra, and more discrete math
  4. Algorithms - check out the famous ones
  5. Software engineering (requirements gathering, planning, testing)
  6. Low level computer hardware
  7. Networking
  8. Operating systems

6-8 I would say are not necessary unless you have interest in a particular niche, but you won't know how interested you are until you check it out.

share|improve this answer

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.