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 want to learn to program in a 'future-proof' manner, if you like. Whilst Windows dominates the desktop OS marketplace (for now), obviously there is a lot of value in learning its languages/frameworks/API's and so on - this might be subject to change as new devices emerge or Windows shoots itself in the foot (over-friendly previews of Windows 8 don't look too appealing...).

Would I be right in thinking that having a solid knowledge of C/C++ for back-end logic/low level programming and the like, combined with an extremely portable language like Java for GUI's and so on, would be a good basis for software development that will prove useful on the most amount of systems? - I'm talking desktop PC's, tablets, phones.

share|improve this question
11  
There is no such thing –  Job Jun 21 '11 at 15:42
    
Build a den and fill it with books. –  Crazy Eddie Jun 21 '11 at 16:21
3  
Build a den and fill it with canned food. The most future-proof programmer is the programmer who's alive after the apocalypse. –  Tom Anderson Jun 21 '11 at 18:03

5 Answers 5

up vote 27 down vote accepted

If you want to be future proof, the best advice I can give you is not enclosing yourself into a technology.

So don't learn APIs blindly. Learn how they are conceived. What are the philosophies behind the scene? What are their advantages and flaws? Think software in general, not a specific technology.

You can also work on good program conception, going to OOP and AOP is a good choice IMO. But don't just understand the mechanism, truly work on the philosophy behind the mechanism.

Don't neglect general computer science, like data structures and algorithms, because they are cross technology knowledge which is always useful.

Also go for good practices. You often have dozen ways to do something, but most of them are crap : bug prone, hard to maintain, hard to understand later or by another programmer, etc . . . Usually, the code is harder to read than to write. So learn how to spend a little more effort on writing to make the reading easier (because you'll read code more than you write).

Learn effective techniques to debug (smart use of log and debugger) and test (how to write code that can be unit tested easily and how to automate these tests).

Then, you'll need a general technology background. I'm talking about very broad knowledge, like how does a processor work (cache miss or branch prediction are good start), about UNIX systems, about network protocols like IP, TCP and Ethernet, etc . . .

In the end, learn how to learn. If you know how to learn, then you can adapt.

You'll need some strong knowledge in specific technologies to be able to find a job, but those are outdated really quickly (think about COBOL for example, or web programming at the time of the IE/Netscape war). So don't rely on them to be future-proof. They will be key to get hired, but definitively not what makes a great programmer and what will make your skills durable over time.

EDIT: If you are just starting, you should definitively get something done. Anything, really. A game like Tetris or snake is a good start, and fun. If you don't get things done, you'll spend to much time learning and really don't get the experience needed to fully understand what you learn.

Let's set an example with design patterns. Design patterns are great and you should definitively use them. But if overused they'll make your code complicated and hard to understand. You'll have to face the problem that a design pattern solves and lose some time trying to solve it or its side effects to fully understand what the design pattern is about. Design patterns must be used as small refactorings over time when code grows. And you'll know when a design pattern is needed when the benefit of it is bigger than the code complexity induced by its use. This requires experience.

So definitively, get things done, them learn from your mistakes. I can't insist more : GET THINGS DONE !

share|improve this answer
    
Good... Great* answer and something that I understand - I understand the need to understand the topic of 'programming' on the whole, not each of the topics you mentioned. I'm not too worried about finding a job in the field since I have a well-paying roll managing an e-commerce site that I'm definitely happy with for the foreseeable. My interest in programming I'd classify as a serious hobby, though I'd like to use it to enhance both mine and other's workflow at work. –  Anonymous Jun 21 '11 at 15:44
    
Added an edit to makes things clearer as a beginner point of view. –  deadalnix Jun 21 '11 at 15:54
    
+1 learn how to learn –  tylermac Jun 22 '11 at 16:32

The answer from @deadalnix is good. I would add to it three things:

  1. reusable information comes from the middle, not the extremes. Minsky presents this in detail in his book Society of Mind so I'll just summarize it as: the top layer is too close to the specific solution for much of it to apply to the next problem, while the bottom layer is too close to the specific platform for much of it to apply to the next problem. The middle layer is where the reusable information is found - the algorithms, patterns, taxonomies, tactics, strategies, techniques, organizations, protocols, et al that are generally useful to solve similar problems regardless of domain (top layer) or platform (bottom layer). Note: these layers have nothing to do with 3-tier architecture, we're talking problem-space/solution-space semantics here.
  2. you won't know what is common/general/reusable until you have seen at least two instances of it. So, study how Windows works internally, then study how linux/unix works internally, and compare the two. The common things are reusable. The different things are design decisions, which may also result in reusable insights.
  3. for any given situation or problem, think about how you might implement the solution, then compare your armchair solution with the actual solution, and try to understand the possible reasons behind the differences.
share|improve this answer
    
Great additions ! –  deadalnix Jun 22 '11 at 1:05

Since you're at the beginning, I'd say just learn a language, it doesn't matter which one. The difficulty isn't in the language (syntax) itself, but in understanding the concepts; and these general programming concepts apply to all programming languages, so learning your second and third and fourth (...) language will be a lot easier.

So, in the beginning don't think too much about being 'future-proof'. However, as you progress, try to become proficient in languages that are very different from one another. Basically, (as you said) you should be handy with a low-level(-ish) language like C/C++, a higher-level programming language such as Java and also a scripting language (Python, Ruby, etc). If you want to go into the really advanced stuff you must also know Assembly.

But don't stress yourself too much about this right now. Learning to program takes years. For the moment, just pick a language like Java or C# or whatever and go for it. :)

share|improve this answer
    
I like the 'pick one' and go for it attitude... I'll probably adopt it. Yay or nay to picking one low level language (C), one high level (Java) and one scripting (Python) language and learning all 3 simultaneously? –  Anonymous Jun 21 '11 at 15:41
    
Are you just starting programming? Then don't learn more than one language at a time, it'll just get you confused. What you need to learn at the beginning are the concepts, not the languages. You should only move to new languages when you are required to. For example, I've only recently felt the need to go into scripting languages, and that's because I decided to make my game scriptable with Python. –  Paul Jun 21 '11 at 15:46
    
I wouldn't say just starting - I've known html/css for years (though they don't really qualify/sort of irrelevant) and have been building PHP/MySQL websites for a few months. Web development I can 'get-by' with, it's software development I'm tackling. I'll heed what you're saying though. –  Anonymous Jun 21 '11 at 15:54

What separates the good programmers from the bad ones is their ability to program in ANY language. As other posters have noted, knowing any significant object oriented language will give you the tools to create great programs and be in demand.

Also if you are still in school make sure you take some writing classes. The best engineers and programmers are also the ones that communicate their ideas well.

Once you start working the best thing to do to prevent being obsoleted is to keep up on current trends. Don't be afraid to leave a job for another one if they are not using current technology or have terrible process etc. The worst thing you can do for your career is take a job that has you working with old technology or a weak processes.

share|improve this answer
    
I appreciate a sound knowledge of programming concepts is essential to be good 'in this game', but having knowledge of the actual language syntax/standard library and what not still proves essential to utilizing all the language's features (where appropriate). Unfortunately I'm not still at school, I'm working - though as I think I said in a previous comment, I'm fairly well paid so I'm not too worried about that aspect. Thanks for the answer. =) –  Anonymous Jun 21 '11 at 17:43

Would I be right in thinking that having a solid knowledge of C/C++ for back-end logic/low level programming and the like, combined with an extremely portable language like Java for GUI's and so on, would be a good basis for software development that will prove useful on the most amount of systems?

I'm talking desktop PC's, tablets, phones.

No. None of that will help.

A solid knowledge of data structures and algorithms -- independent of any specific programming language -- is more valuable than "low level programming and the like".

An "extremely portable language like Java" is just as portable as C and doesn't help. The Next Big Thing will be so different from these languages that your super-portable Java will be a liability, not an asset.

Mac OS (desktop, tablet and phone) is all done in Objective C. That might be a place to start.

Windows (desktop, table and phone) is all done in C#. That might be a place to start.

share|improve this answer
    
I was comparing Java to C as both being portable languages - with Java being being low level and high level respectively, which is kind of true... As you just said yourself, Mac OS = Obj-C, Windows = C#, which is where I don't want to specialize in one and cut off my options, or both and be a 'master of none' if you catch my drift. I appreciate what you're saying, but a solid knowledge of data structures and algorithms with no knowledge of a programming language is just as useless as knowledge of a programming language without the latter. –  Anonymous Jun 21 '11 at 17:40
    
@Chris Bridgett: You're completely mistaking the point. There are universal fundamentals, and a programming language is neither. First, learn the fundamentals. Then, a language (or an OS) is simply frosting on the cake. Fundamentals are the cake and are future-proof. –  S.Lott Jun 21 '11 at 18:07

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.