On Fri, May 6, 2011 at 7:29 AM, Grant Shipley <[email protected]> wrote:
> I say start with the language that is commanding the highest salary in the
> market for the next 5 years.  Once you have that down, start picking up
> languages that you have interest in.
>
> That being said, I think everyone should be learning C / C++ in school.  It
> teaches students things about memory management that is critical no matter
> what language you use for your day job

If you get to pick what language to start with, you're probably
self-studying for your own amusement.  If you're self-studying, the
most important thing is picking a language that's fun for you, or
helps you accomplish some immediate thing that would be fun for you to
accomplish.  Otherwise, what's the point of learning it?  Just keep in
mind that, as a beginning hobbyist, you will be able to accomplish
cool stuff but you will lack deeper understanding of a great many
things, so it would be advisable to keep ambition, advocacy, and
criticism in check until you've gained a lot of experience and
wider/deeper knowledge of computing in general.

Be skeptical of advice people give you, because computing is a very
wide field and people tend to dig deep and narrow instead of wide, and
to get attached to specific tools and techniques rather than general
principles.  It's okay and probably advisable to concentrate on
specific tools and techniques as a hobbyist, but just keep in mind
that you probably won't be equipped to give very good advice either
until you've got a lot more and a wider range of experience.  Of
course, don't be afraid to share how you've done things in attempt to
help others, and be willing to accept constructive criticism, just
keep things in perspective and be aware that you might be horribly
incorrect about things. :)

If you want to program as a career, you really should get the broad
background that a formal education will provide.  If that's not an
option, for whatever reason, then do look at what languages are
commanding the highest salary *in fields you are interested in*.  High
salary is nice, but whether it is the primary consideration for a job
depends on how a job fits into your life.  Definitely look at the
languages used in fields that are of interest to you!  Computing and
programming are being used in more and more fields, and they don't all
use the same languages and tools.

For example, if you want to get into custom enterprise application
programming, you definitely want to concentrate on Java and C#, with
some strong SQL skills.  If you want to do web development, learn
HTML, Javascript, SQL, and at least one of PHP, Python, Perl, Ruby, or
Java.  If you are interested in electronics, you will probably like
embedded systems programming, in which case you should learn C and C++
first.  For some reason, Tcl and Lua are fairly common in the
EE+embedded software world.

Meanwhile, learn the underlying concepts of computing, at least well
enough to know what you don't know about them.  This would include
basic algorithms and data structures, the standard computer memory and
execution model (heap, stack, text, etc. areas, parameter passing,
function calls), resource management techniques (both memory and other
system resources like file descriptors, etc.), language implementation
techniques (compilation, interpretation, hybrid forms like bytecode
interpretation, optimization techniques like JIT compiling, inline
caches, etc.), different categories of programming styles (procedural,
functional, relational, logic, dataflow, etc.), techniques and
concepts relating to parallelism (concepts of processes, threads,
coroutines, shared memory, message passing, synchronous vs.
asynchronous communication, transactions, mutual exclusion,
semaphores, determinism vs. nondeterminism, single vs. multiple
processors, etc.), different kinds of processing engines (RISC, CISC,
stack machine, vector processing, GPUs, DSPs, etc.), operating systems
fundamentals (task switching and scheduling, memory protection,
virtual memory, context switching, file systems, networking stacks,
micro vs. monolithic kernels, OS APIs, ABIs, etc.), numerical
computing (IEEE floating point, sources of error in integer and fp
math and how to minimize them, algorithms for solving math problems in
a reasonable time frame, etc.), artificial intelligence stuff (logic
techniques, statistical techniques, tree search techniques), signal
processing stuff (fourier transforms, filters, video and audio
specific stuff, etc.), networking principles (OSI model, signalling
techniques, ARQ techniques, network topologies, packet switching vs.
virtual circuits, and tons of other stuff), database fundamentals
(different database types, relational database theory, normalization,
data structures and algorithms for storage and retrieval, etc.), basic
CS theory (discrete math, grammars, automata, inductive proofs,
complexity, computabiilty, etc.), programming language theory (type
theory, operational/denotational semantics, lexical analysis, parsing,
general tree transformations, specific kinds of optimizations,
abstract interpretation, etc.)... I could go on and on.

Not all topics will be immediately relevant to everyone, but you would
be surprised how often insights developed in a specific field end up
having much wider applications.  Clearly, there's enough information
to keep a full-time student busy for several years just scratching the
surface of each general topic!  Not to mention diving into the history
of the development of computing, which is fascinating in itself and is
ripe for mining good ideas that were ahead of their time and were
since forgotten or otherwise discarded.

My point is this:  none of us know it all, or even a significant
percentage of the total computing knowledge.  There are more ways to
approach programming and computers than you can shake a stick at, and
in none of them are you going to master everything.  Pick what's fun
and interesting and useful for you, keep in mind that you don't even
know a fraction of what you don't know, and do cool stuff with what
you do know!  Try to keep your current knowledge and experience in
perspective, though.

        --Levi

/*
PLUG: http://plug.org, #utah on irc.freenode.net
Unsubscribe: http://plug.org/mailman/options/plug
Don't fear the penguin.
*/

Reply via email to