tags:

views:

226

answers:

12

Hi! I'm currently learning to program, and I didn't take CS classes so I'm basically starting out on the bottom. I have been putting together code on and off for many years, but haven't really had a good understanding of essential concepts needed for enganging in bigger projects. Object-orientation is an obvious one, and I feel I'm beginning to understand some of the concepts there. Then there is a lot of buzz and methodology, such as MVC, UML, SCRUM, SOLID and so foth and so on.. I've looked at many of these but I'm always stumped as most explanations seem to require some understanding of other concepts.

I want to learn this stuff the "right" way, so where do I begin?

What are the overarching constructs I need to understand that enable me to understand all the underpinnings of software architecture/design/development?

What am I missing?

Are there constructs and concepts that can and should wait until I've cleared the foundation?

+3  A: 

The SOLID principles are probably the most important.

From those you understand the motivation behind using a pattern such as MVC, why people think of persistence ignorance as important and so on. They are at the core of the majority of good practices.

Garry Shutler
I've only briefed by the SOLID principles, but I'll make sure to read Unclebob's paper "Design Principles and Patterns". Thank you!
tplive
+3  A: 

Loose coupling, high cohesion.

And as for books, Code Complete covers almost everything at some level, at least.

Joonas Pulakka
+1 for code complete!
gath
I'll have a look at the book, from the web link it looks very interesting. Thank you for your tip!
tplive
A: 

I'd recommend "Object Oriented Analysis and Design with Applications" by Grady Booch et al. The latest editoin has detailed explanation of concepts of OOAD including MVC, UML (which he invented), and discussions on how to manage the whole process of software development. The second part of the book exemplifies all this by developing 5 sample systems (with sometimes orthogonal aspects from the very core).

MadH
I've borrowed "The Unified MOdeling Language User Guide" by Booch et al, from a colleague and started perusing the first few chapters. I'll look at the other book as well! I love learning by example! Thank you! :)
tplive
ooad is much more thorought book than just guide to uml, check it out as well :-)
MadH
+2  A: 

Software development is a HUGE arena and you should be careful that you don't take on too much too quickly. Unless you're going to go in the direction of functional programming I'd suggest you start off by making sure you fully understand the concepts surrounding OO design and programming as this should be your foundation.

Once you understand that well you'll be able to understand design patterns a lot better and get a feeling for when to use them.

I'd suggest you try out a few languages till you find one you feel comfortable with, personally my favourite language is Ada which is a very pure OO language but in the business world I work in C# which still has a lot of issues but these are outweighed by the more vibrant job market.

I wouldn't worry too much about Scrum at this stage as you need to focus more on your dev skills before worrying about project management.

The most important thing is to work with as much code as possible, download lots of good reference solutions and work through the code till you understand it, and try and keep an eye on the development trends.

If its viable you may also want to considering attending some developer conferences too as these can be very inspirational.

Mark
The HUGE part is exactly what prompted my question - what do I start with, and what can wait? Thanks for your response!
tplive
A: 

You'd have a decent foundation if you surveyed basic Data Structures, Algorithms, and Algorithms Analysis.

totorocat
A: 

Another good one is of course Design Patterns by GoF which will give you an idea of loose coupling, ways to efficient encapsulation and reuse of code, etc

MadH
A: 

For what concerns the algorithmic part, take any book which is not bounded to a particular programming language. My favorite is Introduction to Algorithms by T. H. Cormen et al, it gets a bit theoretical at some points, but I especially like it when they are proving certain things and not just asking you to believe it.

MadH
A: 

When you are working with any modern general purpose language, it is probably a good idea to get a handle on patterns (MVC or Model-View-Controller is one). The book by the "gang of four" is a must read for this, or at least research a few and use it as a reference. clicky

Refactoring is another concept that should be in your arsenal. The book by Martin Fowler on this subject is a very nice read and helps understand the aforementioned patterns better also a little explanation about UML is included.

Can't post more than one hyperlink so...

search on amazon for: Refactoring, Improving the design of existing code

When you want to communicate your designs UML (Unified Modelling Language) is the 'tool' of choice for many people. However UML is large and unwieldy but Martin Fowler (again) has managed to boil it down to the essentials.

search on amazon for: UML Distilled (make sure you get the most recent one)

SCRUM is one of many methods that is used to manage software development groups, I do not think there is much merit in learning that when you are just starting out or on your own. Especially not in detail.

Hope it helps...

PS: SOLID I haven't heard about yet, somebody else has to help you there.

NomeN
+2  A: 

Stay away from ACRONYMS (including those you've listed) and Methodologies(tm). At least in the beginning.

Read good books. Start with this one: Pragmatic Programmer. Learn algorithms and data structures, possibly from Introduction to algorithms by Cormen et al.

Write a lot of code. Practice is more important than anything else.

Igor Krivokon
Good books are always welcome. But I need to know that I'm "equipped" before taking on any book. For instance, I'm just finishing the SitePoint book "Build Your Own WebSite Using ASP.NET 3.5" and it's been a good learning experience, but I feel that I've still only touched the very tip of each topic covered... So I need to dig into each topic more, build on the examples and make it "my own"..
tplive
+1  A: 

How to test software with unit tests. Being able to do that will solve 90% of all the other issue automatically since you can't test while they are around.

When you know how to test, you can start on advanced topics like design.

Aaron Digulla
I've heard about Unit testing, and it's an interesting topic, but I've laid off on it as I initially thought it would require too much insight.. Now I'll look at it again. Thank you for your tip!
tplive
You're already unit testing your software, you just throw the unit tests away: You write a piece of code, you run it, you check the result, you fix the bugs, repeat... Automatic unit testing is simply telling the computer what's right and wrong and let it do the checks for you.
Aaron Digulla
A: 

I think that you should start coding real world problems to get a feel for problems in the programming domain.

Then you have a better background to understand why objects are important. Then, after managing objects, you will learn why patterns and OO principles are important.

Personally, I highly recommend the Agile Software Development, by Robert C Martin.

But it may be a long and tiresome read unless you have a feel for the problems being solved. I'm afraid that you may need 500-1000 hours of coding at the minimum before you get an appreciation that the problems being solved are real.

And it probably takes 7000+ hours before you develop an instinctive heart-felt pain from merely reading the problems, making this sort of book become the page-turner that it should be.

Regrettably, many of the sound practices that you should develop are only appreciated after having to live with your code over time. If you just do many excercises and abandon the code afterwards just "because it works", then you are missing out on the greatest pain of all. It is a luxury our industry does not have, and "technical debt" is a very very real and costly to those with large code bases.

Tormod
A: 

I feel kinda silly answering my own question like this.. :) But one valuable resource I've found for learning to write code, is the Euler Project at http://www.projecteuler.net

It's basically a collection of mathmatical problems that you solve by writing your own solution to it. Once you've found the answer to a particular problem, you're allowed access to that problem's forum where different solutions are discussed. I was amazed at how much I was learning in a) solving a challenge, b) reading about other peoples approaches and c) how many programming languages there are out there! :)

The problems start out easy (you can tell by the number of people who's solved them) and progress to harder and harder problems.

Currently I'm working on problem #3, having solved the previous two... I recommend you start chippin' away at them, no matter your level!

tplive
if you like Project Euler. Try http://www.pythonchallenge.com/ too.It is Python focused but you can solve the Problems without Python. I like it very much cause you have to unlog the next Challenge.
bastianneu