Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.
To all of you paid, professional, developers, how did you begin? Did you pick up a book, search the internet, or go to school?

Programming at it's heart is simply problem solving. As a kid I wasn't really thinking about programming (although I did have a ti-99 at one point and remember writing t-basic programs - sucked b/c I didn't have any way to save them lol), but more about taking things apart and putting them back together again. My toys were always in pieces and being rebuilt, my NES was the same way, although I was very careful to make sure I didn't leave it in a non-working state ;)

I started college as pre-med and got my first 'real' computer (P75 ftw!) and it only took 1 semester for me to realize I was spending more time programming and solving other computer problems than I was learning about biology. Switched majors and now I've been developing software for more than 10 years and have my masters to boot.

Looking back at my childhood and my interests growing up, I don't really know how I could have been anything else.

Well the instructors leave WAY TOO many gaps in explaining certain things. They forget key elements and end up leaving everybody in the dust. The next day you show up you think to yourself, "I'm sorry, was there a class yesterday after I left? Do they have classes at 11?"

Frustrating.

The thing about computer science is that you can't expect much of it to be taught in the class except for the base underlying principles. I'm not trying to be rude to you, but it's a huge field that is always advancing so you have to be able to take bits of what you know and work on connecting them together on your own. After my first year in undergrad, languages were no longer taught (they were only taught in the first year as a means to explain whatever the topic happened to be). The teacher would walk into class the first day and basically say we're using X language for all the assignments, look it up.

As an aside I had one teacher who didn't care what language the assignment was turned in as long as it had a compiler for his linux box and OGL bindings (it was a graphics class). I turned every assignment in that semester in a different language just to force myself to explore other languages :)

I don't know how anyone could become an effective programmer from books alone. I've read ahead in my book and it all seems foreign to me, until my instructor explains it.

Any single book is just a start (I have a bookshelf full and more PDFs than I can count). If you have a question from your reading then find another book, search the internet, or ask a question on a forum like this. If it's code related then build the smallest test program you can and run it. Change it, run it again. Watch what happens and explore different things. That's how you learn.
 
A thirst for knowledge and a desire to tinker are important assets in this field. A good programmer is the type of person who takes something apart and puts it together again, just to see how it works. Then, you think "is there a better way that this could have been done?"
 
Here is a tip that I live by.

Don't be afraid to throw out what you've done and start over. Typically it takes 3 times before getting something right. The first time to learn what needs to be done. The second time to find all the gotchas that show up with your first design. And finally the third time is the first working version.
 
In response to the OP:

I originally wanted to study Electrical Engineering, but I had a difficult time. So I switched to CS. Really loved it, particularly programming assignments. Went on to get a Graduate degree in CS. More than the algorithms or theory, I enjoyed putting programs together and just basically running them to produce some sort of data.

It should be pretty obvious that I suck at UI; not that I don't appreciate it, I just don't understand HCI very well.

So, the short answer is, I went to school to learn programming. Had lots of bad profs, and a few good ones.
 
When I was your age! LOL

I graduated college before there was an official ANSI C standard. The CS program was pretty much the EE program. We took all the same math, physics, statistics, etc. and differed only in our core classes.

I actually took a logic design class where we designed a physical ethernet card. You had to see the look on all the CS kids faces when the prof. started drawing capacitor and logic gate symbols. Guy never gave us a break either, we had to crack open some EE 101 books and figure out all that voltage (a lot of carry over from physics) and basic building block stuff.

The only official declared language in school was assembler, since it's tied to a specific chip. I learned Vax assembler. I actually used it in my first job! Converted some assembler to C.

All other classes taught abstract theory and it was up to you to figure out how to implement. A great learning lesson, since we were allowed to use Pascal, Fortran or C at the time.

Every language has pretty much the same crap, so if you learn one, you can pretty much adapt to any other. C++ is probably the hardest, since it is a "base" language and doesn't have a whole lotta helper classes in the core language. When you get to Java, you'll learn the subtle differences between the two languages, and really appreciate all the classes you have access to to get the job done. Python, Perl and the others are mainly scripting languages in my experience. They can do it all, but in context, C, C++ and Java are the heavy lifters (besides Cobol and some other Mainframe languages).

My only advice is to get a good jump on the homeworks, so if you have a question, you can drop an email or ask in class.
 
I am currently a 3rd year student in my university and in one year i will take my bachelor degree. I can assure you that all things you learn in university are rubbish . To say it more politely , there are only the very basics of programming.

If you want to learn programming you have to do it by yourself buddy. I have many friends who are good programmers and they learned how to program by their own. Open a book , search the internet . This is the way you learn.

The bachelor degree is just a proof that you know the basics.
 
I am currently a 3rd year student in my university and in one year i will take my bachelor degree. I can assure you that all things you learn in university are rubbish . To say it more politely , there are only the very basics of programming.

If you want to learn programming you have to do it by yourself buddy. I have many friends who are good programmers and they learned how to program by their own. Open a book , search the internet . This is the way you learn.

The bachelor degree is just a proof that you know the basics.

This is not strictly true - some universities teach very little, but a good CS course will teach you a lot. Choosing the best course/university/college is important.

I meet people who have a degree in CS and the only programming they have done is Excel macro programming.

A CS degree is a qualification that helps you get a job, but personally I think it is worth checking the course content and comparing to a few other degree courses. If you don't care what you learn at university, then just go for the easiest course and get some sort of qualification.

But yes, you do a lot more tangible learning once you specialize a bit more outside of the education system.
 
I am currently a 3rd year student in my university and in one year i will take my bachelor degree. I can assure you that all things you learn in university are rubbish . To say it more politely , there are only the very basics of programming.

If you want to learn programming you have to do it by yourself buddy. I have many friends who are good programmers and they learned how to program by their own. Open a book , search the internet . This is the way you learn.

The bachelor degree is just a proof that you know the basics.

I agree with you to the extent that a university CS program will not teach you to program. I disagree with your sentiment that a basic level of programming is all you take away from a bachelor's program. To the world at large it means:
You have what it takes to finish a ~4 year commitment
You know how to learn things
You know how to think about things
You were exposed to things outside of your area of study

I think these things are more important than knowing how to program. If you want to get a degree/cert that means you learned how to program, there are technical schools for that. IMO learning to program is the easy part. The theory, thinking about problems, breaking them down, knowing when your algorithm is the problem and when you need to make constant time improvements to speed something up, etc. is a lot more important and a lot more difficult. Once you have that down, and you've shown that you know how to learn picking up a particular language or honing your programming skills are just details.

-Lee
 
Quite a few of the best CS departments (in the world) treat it as a maths degree and teach very little if any programming.

Exactly, so check the course content rather than the rating of the department. I had already done a year of professional programming before going to university, but I learned a lot more there.

I think it is actually the other way around in that university taught me the the complex aspects of programming, but expected you to know the basics (or at least learn them in your own time).
 
I agree with you to the extent that a university CS program will not teach you to program. I disagree with your sentiment that a basic level of programming is all you take away from a bachelor's program. To the world at large it means:
You have what it takes to finish a ~4 year commitment
You know how to learn things
You know how to think about things
You were exposed to things outside of your area of study

I think these things are more important than knowing how to program. If you want to get a degree/cert that means you learned how to program, there are technical schools for that. IMO learning to program is the easy part. The theory, thinking about problems, breaking them down, knowing when your algorithm is the problem and when you need to make constant time improvements to speed something up, etc. is a lot more important and a lot more difficult. Once you have that down, and you've shown that you know how to learn picking up a particular language or honing your programming skills are just details.

-Lee

^ Excellent points. I personally dislike CS courses that focus too much on programming languages - don't call it CS if it is all about programming because that is not what CS is about. In fact, in my department, there was some serious push/pull towards math, theoretical CS, and programming by different lecturers. I think that meant we got the balance reasonably right - I still would have preferred more applied math but I guess you can't have everything.
 
^ Excellent points. I personally dislike CS courses that focus too much on programming languages - don't call it CS if it is all about programming because that is not what CS is about. In fact, in my department, there was some serious push/pull towards math, theoretical CS, and programming by different lecturers. I think that meant we got the balance reasonably right - I still would have preferred more applied math but I guess you can't have everything.

I'm sure there must be an equivalent in most countries, but in the UK there are certain "accredited" CS courses. Accredited in this case by BCS (British Computer Society). This means that to be accredited, the courses have to cover certain topics as a minimum. So there has to be quite a lot of maths and theory.

I am not quite sure why people think you can't have a balanced degree with a lot of programming too.

For reference and for the OP, this was my CS module list - I may be slightly biased, but I would look for that kind of stuff in a CS course:

Year 1

Computer Fundamentals
Programming Project
Java I
Java II and Algorithms I
Communication Skills and Project Management
Internet Computing
Systems Modelling
Operating Systems
Fundamentals of Information Systems
Organisational Behaviour
Discrete Mathematics I
Mathematics for Computer Science
Computing Mathematics I
Computing Mathematics II
Computing Mathematics III

Year 2

Software Engineering
Algorithms II and Data Structures
Object-Oriented Methods
Human Computer Interaction
Database Systems
Systems Design and Group Project
Application Building with Java
Networks and Data Communications
Pervasive Computing
Discrete Mathematics II
Data, Audio, Graphics & Image Signal Processing with MATLAB

Year 3

Database Management
Graphics
Image Processing
Artificial Intelligence II
Advanced Object-Oriented Systems
Parallel Processing
Advanced Database Topics
Multimedia
Information Requirements Definition and Management
Information Systems Management
Individual Project
Distributed Systems Technologies
Scientific Computing
Mobile Communications and Meta Heuristics
Knowledge Based Systems
Knowledge Management
IS Research Techniques
 
Ok, to make clearly what i wanted to say , and always speaking from my personal experience , what you learn in university it's not what the real world uses.

In my case, i have not actual time to implement my projects , as i would like due to many other assignments running in the unic like mathematics for example. Again to make myself clear i find mathematics very useful and actually i like them very much and i am one of the best students in my university on them but i believe that if i devoted that time in programming a java class for example i would had twice the knowledge i have now. And yes in the university you learn how to become a problem solver , not the actual thing and what real business uses today.

Anyhow this, as you correctly all stated above depends on the university as well on the personal opinion , and how each one prefers to learn.

In my case i prefer to be just a descent student (than having the best grades) and devoting my whole spare time in learning things that actually interest me than completing a project on general courses (history sociology etc).
 
I have found that learning the syntax of a language, like C versus Python is one thing, and you can learn this very quickly, but the real fun stuff in my university engineering classes were on topics like how to design your software and describe the designs in notations like UML. Or understanding typical data structures like trees and linked lists and when to use them. Or coordinating the real-time behaviour of multiple processes with semaphores and queues, and how a single CPU can "appear" to be multitasking. Or understanding databases and how operating systems work. Or recognizing that programs are often written using common "design patterns", like state machines. Or higher level topics like how a program running on my computer can access code written on yours over the network, or how artificial intelligence algorithms work.
 
In my experience and opinion what you should learn at University studying CS is an understanding of certain concepts (irrespective of the programming language used).
You should learn something about algorithms, design patterns, object orientation etc.
This will normally be accompanied by programming examples to give you an idea how it can work.

But as it was mentioned before, before starting to "design" the application/program, you need to understand the business purpose and the business logic you try to support with software.

Up until this point, no real programming or programming language is involved.

Learning to code comes at a stage when you start doing real projects in real companies with a real business purpose.
You will most probably be given the language you have to code in and hopefully will be working in a team you can learn from and grow.
By coding "real" applications you will learn the API of the specific language and you will learn certain frameworks and how to use them over time.
At that point you will find yourself in a situation where you see the concepts you learned at varsity popping up everywhere in the API and frameworks used and it will give you the advantage to quickly grasp how things work and be able to apply and use them to serve the business purpose.

Languages change but the concepts remain (e.g. recursion, sorting algorithms, composite pattern etc).

So don't get to frustrated by not being the perfect "coder" at varsity.
 
I graduated from UC with a B.S. degree in Computer Science. I first learned programming in high school in an intro to C++ class. In college i started off Mechanical Engineer but switched to CS due to job opportunities.

At UC, they teach a lot of conceptual ideas that are lay the foundation for programming as a whole. You'll learn how to develop for embedded systems, algorithms, design patterns, etc. The programming assignments are pretty difficult, but you learn to kinda just do them, but unfortunately you wont fully understand why you do things until you start working. Eventually after work experience, you will start to become better at coding to the point where coding takes up like 10% of your time and design takes up 90% of your time.

You'll learn that design/test is more time consuming than the actual coding part. Design is important because it's how you problem solve and how you make your program efficient. For example, if you interview at Google/Microsoft, many of their interview questions are more about efficient problem solving than actual coding.

I hate to say it, but I recommend all beginner coders start at C/C++. It's much easier going from C/C++ to Java than the other way around. Java is also much easier in the sense some conceptual stuff is abstracted out which could be bad in let's say a low level whiteboard interview
 
I began to program a mainframe when I was in high school, earned a two-year degree in Data Processing,got a B.A. degree with a minor in Computer science, and a Certificate in Computer Programming. So most of my training has been in colleges and some has been in a university. During my first job, I learned how to use IBM PCs.

In college, I did plenty of voracious extracurricular reading about Computer Science. Since I've always been more theoretical than practical, I've always bought books by well-known computer scientists or books that they recommended. Unfortunately, books by some computer scientist sometimes didn't help my coding style, though, because some computer scientists wrote almost unreadable programs.
 
I agree with you to the extent that a university CS program will not teach you to program. I disagree with your sentiment that a basic level of programming is all you take away from a bachelor's program. To the world at large it means:
You have what it takes to finish a ~4 year commitment
You know how to learn things
You know how to think about things
You were exposed to things outside of your area of study

I was actually surprised for a little while, when I found out that the Computer Science/Maths dept had more of a focus on Logic and Boolean/Matrices Mathematics than the actual CompSci part itself. Apparently we're also big on Internships and working with companies. Entire Software Engineering papers are based working in groups for companies.

"If CompSci is an Iceberg, then University is the visible part and the hidden part is the Books, Internships, Self Study etc." - Comp103 Professor (Nope can't remember his name. :eek: )

I hate to say it, but I recommend all beginner coders start at C/C++. It's much easier going from C/C++ to Java than the other way around. Java is also much easier in the sense some conceptual stuff is abstracted out which could be bad in let's say a low level whiteboard interview

I would second that, the C part anyway. Whether if its C/C++/Obj-C/C#(Maybe not so much C#).

In college, I did plenty of voracious extracurricular reading about Computer Science. Since I've always been more theoretical than practical, I've always bought books by well-known computer scientists or books that they recommended. Unfortunately, books by some computer scientist sometimes didn't help my coding style, though, because some computer scientists wrote almost unreadable programs.

I envy people like you. I can't understand subject until it is shown to me physically or it is explained to me in head crushing detail. Physics was far better at teaching me mathematics for example.
 
I would second that, the C part anyway. Whether if its C/C++/Obj-C/C#(Maybe not so much C#).

I agree. I think C/C++ is essential to a developer's repertoire. Obj-C/C# should not be counted as a "starting" language. Both are confined to a specific platform and may constitute bad habits. I think C++ is ok nowadays since most major languages are object oriented. I've seen a lot of developers get too used to writing in C such that they write C++ code as a Object Oriented C and not fully utilize C++.
 
I personally don't think learning or using C++ is necessary. I don't find myself using it. Pretty much any place I might use it at work I use Java instead (large multi-threaded server-side data manipulations with database connectivity). C is an absolute must. It's the foundation of pretty much everything. I think it's very important to understand who C gets compiled into assembly and to understand that assembly. Good programmers understand the stack, how it works, where variables actually get stored, the whole lot.
 
I agree. I think C/C++ is essential to a developer's repertoire. Obj-C/C# should not be counted as a "starting" language. Both are confined to a specific platform and may constitute bad habits.

C++ and C create "bad habits" themselves.

I don't think platform restriction is a major con as you're going to need to learn platform specific code anyway.
 
Don't let my comment fool you, Morph. I needs hands-on experience, too. The trouble is that, if I ignore the theory and go straight to practice, I miss the forest for the trees. That's why I regret having attended a community college that crammed about 11 programming languages into my head. For me, programming languages are surprisingly easy to learn. But my philosophy degree makes me prefer technology-independent knowledge to knowing how to use some programming language's statements. In fact, philosophical thinking helps a lot when I'm trying to create abstractions and to do bottom-up programming.

The extracurricular reading caused trouble for me, too, by the way, when I talked about what I learned from the extra books. Other students thought I was showing off when I didn't mean do that. God knows others people are much more talented than I'll ever be. The computing industry is a great one for me to to be in when I need to be humbled.
I envy people like you. I can't understand subject until it is shown to me physically or it is explained to me in head crushing detail. Physics was far better at teaching me mathematics for example.
 
Right now I am in the CS program at my university and its a broad spectrum of programming. I took two first year classes where in one it was all OO java while the other was more of a fundamental computers / ee class. The latter actually helped me to understand what I was doing in programming better as we learned risc assembly on an integrated microprocessor (TI MSP430) and then went up to doing c. It helped to understand and grasp on exactly how things were working and also to understand what my high level abstractions were doing.
Although back in Middle school I started learning AS 2.0 then HS I took CS 1 & CS 2, I really didn't get a lot out of them. It wasn't until I got an internship at a local Austin,TX iphone game company that I got a lot better at programming. I was forced into learning full time and also could ask questions to the other guys working there, it took me months to get down a general understanding of OOP and objective-c.
When I went back to college and started taking Java again, it was kind of a step down to me. But eventually I saw how much it could improve my object oriented skills and really made my objective-c programming a lot better.
Soon I will be taking some more classes but as I learn some more languages, it helps programming in all of them.
 
I specialized in logic when I earned my philosophy degree. So I may have learned more about it than many computer scientists have learned about it. Sometimes I can hardly believe how many subfields it includes. During his seminar about Godel's Incompleteness Thorems, a computer scientist kept saying, "You probably don't know this, but . . ." or something like that. Which explains why the Philosophy Department's logician, who earned his doctorate from Stanford University, must have surprised the presenter he talked privately with him. That logician, Dr. Anthony M. Ungar wrote a book called Normalization, Cut Elimination, and the Theory of Proofs, just the sort of book you'll love to curl up with if you're like me. ;)
I was actually surprised for a little while, when I found out that the Computer Science/Maths dept had more of a focus on Logic and Boolean/Matrices Mathematics than the actual CompSci part itself.
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.