

Advice for an aspiring programmer? - pseudo-gorgias

Hi everyone,<p>I'll try to detail my situation as quickly as possible, any input or advice would be greatly appreciated.<p>I'm a 2010 graduate of a liberal arts college with a degree in philosophy and classical studies (emphasis on Greek).  Upon graduation I took a job on a mid-term senatorial campaign, before going off to travel for the winter and part of the spring.  I then took temp position (through mid-September, with the possibility for an extension) at a marketing agency in the New York metro area.<p>When I began college, I thought I would be a comp lit or English major, but through my exposure to philosophical writings, I gradually became enamored with the type of rigor and lucidity associated with analytic philosophy and symbolic logic--had I had my current preferences then, I would have majored in mathematics or cs, but as it is I have the degree I have.<p>Lately, I've really taken an interest in programming--it's really not too far off reading Greek, in certain respects.  I've been working my way through LPTHW and I think SICP will be next on my agenda.<p>I really would like to get into development one day, and I'm more than happy to teach myself the relevant languages.  My worry is that no matter how hard I work, I will still lack the appropriate signaling mechanisms.  I have no practical experience with python, nor a cs or math or econ degree.  Given the level of competition in the economy generally right now, is there any feasible way I can make up this deficit?  My hope is that I'll be taken on in a more permanent capacity at my current firm, so I can have 10 or 11 months of employment while I polish up my python/lisping skills.  Does this sound like a decent plan?  Is there anything else I can do to bolster my resume/make myself more appealing to perspective employers?  Am I making any obvious mistakes?  Is this whole thing hopeless?     
Thanks again for any input.
======
DanWaterworth
Let me start by saying that it's not impossible, I know this for a fact
because I did it. I'm 19 years old, I don't have a degree and a few months ago
I landed my first job. I'm working as a software engineer.

Having said that however, don't for a moment think it will be easy. I've been
programming as a hobby since I was nine and, after finishing full-time
education, I spent the best part of a year learning and brushing up on my
skills. Crucially, this was not something I did in my spare time, but
continuously; I was effectively in full-time education.

There are two distinct pools of knowledge that it's in your interests to
nurture: theoretical knowledge and practical knowledge. You will only be
effective when you have a solid grounding in both. I may have made the mistake
of focussing to heavily on the theoretical, but by working is possibly the
best way to gain practical knowledge, so I'm addressing the imbalance.

There are a few topics which I focused on that have proved to be invaluable to
me:

* Data structures and database design,

* The web stack (by which I mean the entire stack, how does TCP work or the OS schedule threads),

* Functional programming,

* Compiler internals,

I would have also greatly benefited if I'd had known more about asynchronous
programming. Specifically, how are synchronous programs translated to work
asynchronously, ie, how do threads work? How is CPS conversion an alternative
to using threads?

Good luck.

------
doctorwho
I have a CS degree and 20+ years of professional experience and I can tell you
that your love of philosophy and symbolic logic will serve you far better than
any of the advice you've received here so far.

Would you just dive into a proof using truth-functional propositional calculus
if you were totally ignorant of the rules of inference?

Would you try to operate on someone without being training in medecine and
surgical techniques?

Ignore anyone that tells you to learn "language X" or "just dive in and build
something". It's bad advice, unless you like stumbling around in the dark.

The right way takes longer but you need to build from a solid foundation.
Right now, you don't know what you don't know.

Which language or platform you choose will be largely irrelevant. Learning a
new language shouldn't take you more than a few weeks. Mastering a new
language is another matter entirely, but essentially still just a matter of
practice.

Invent your own pseudo-language (or read about pseudo code) and learn how to
decompose a problem into discrete steps. Learn to recognize and apply patterns
in your solutions. Familiarize yourself with common data structures and
algorithms. Do all of this before you ever try to write a line of code.

While you're doing that, read voraciously. Books. Blogs. Read everything you
find anywhere that good programmers congregate (like Stack Overflow). Ignore
the loud hand-waving pundit. Listen to the quiet voice of sanity. You'll soon
learn to separate the wheat from the chaff.

Unfortunately, the wrong way sometimes works. The danger is that you'll build
mental models of how things work based on the language and environment that
you use. We need these models to cope in the absence of deep understanding.
It's how the brain works and we do it almost automatically. However, if you
approach the process at a more abstract level your model is more encompassing
and you can easily simplify it to fit the situation. Shifting your thinking
from abstract to concrete is easy, the other way is much harder because you're
missing the big picture.

------
apsurd
I say this all the time: the best advice I was given about going out in the
working world is "the bar is lower than you think".

Any person genuinely interested in their work will ALWAYS think they are less
capable than they actually are. It's human nature. This is because someone who
truly respects their craft is of course going to be humbled by it. I know that
I know nothing sort of thing. I'd argue that the absolute top tier world class
developers are the some of the most humble. Of course there are outliers but I
think humility is a requisite quality of true mastery for the most part.

What does this mean?

It means your background doesn't matter. If you are motivated to do your best
and ready and willing to work hard and learn and improve then you are already
better off than 90% of the workforce out there.

Every company has their own processes so many times it not really about what
you know but how eager you are to learn.

Companies hire for character not necessarily for current knowledge. I've seen
with my own eyes people get hired for ruby jobs that _did not know a lick of
ruby_. They come from php backgrounds etc.

So fwiw and this is just my experience as a web application developer with no
formal education : It's not about what you know, its about your desire to
learn, your motivation, and your character attributes that count.

Be genuinely motivated to better yourself, ALWAYS convey your desire for
personal excellence, and you will never have a problem finding a job.

Best of luck.

(p.s. get a a github account and push code like a madman)

------
CyberFonic
Programming and software engineering are not the same thing. You can teach
yourself a bit of programming from books. Software engineering on the other
hand requires a far more holistic body of knowledge and experience.

SICP and LPTHW are not in the same league. SICP is what you want to really
grok if you want to become a software engineer and LPTHW is sufficient if you
want to become a great Python programmer. PHP and Ruby are also fine starting
points. But to be valuable as a potential hire you need to understand the APIs
and main frameworks for the language you choose to become proficient int.

Stanford, MIT and Google have excellent video courses publicly available if
you prefer lectures to reading books. Either way, you need to write lots of
programs, ideally for something that you are really interested in and get
feedback from more experienced people.

------
wimplash
Whatever you do, make it publicly-visible. Companies will not hire a software
developer with no work experience, who can only _say_ that they are able to
program in _X_.

If you are able to...

* Demonstrate your abilities in programming language X by showing them your code through a public repository (i.e. Google-code, github, bitbucket, etc...)

* Demonstrate your communication abilities/soft skills by showing them the supporting documentation (i.e. a development blog, user documentation, etc...)

* Demonstrate your ability to explain/defend the design/implementation choices made in the development of your application

...then you have a pretty good foot in the door for getting into the software
development industry.

On the converse, however, not all hiring managers will/are able to take this
much time when investigating potential candidates.

------
nandemo
I know a lot people rever SICP, but I think at this stage it's not the best
way for you to learn programming. It's a bit too theoretical.

I have a degree in CS and a love theory. I guess philosophers also tend to
prefer the theoretical aspects of CS. The problem with this is that you can
study theory for years on end and still not be very good on practical tasks
that are essential to getting a job or building a website.

After you finish LPTHW, start making small projects. Make scripts to automate
stuff that you often do. Read good source code. Learn how to use a source-
control system (subversion is fine for this). If you wanna build a website,
learn some SQL, HTML and Javascript.

------
tryitnow
INMHO, the best thing to do is to make something cool and interesting and
share it. Next up is to meet other programmers, e.g. meetups, etc. Another
suggestion: maybe even take a class or two just to see how learning in school
is different than learning on your own. It will also expose you to more people
with similar interests. I am not a fan of conventional schooling, esp. for
programming, but it does have its benefits in terms of socializing with others
(profs and students).

Your path is not unrealistic, some of the best programmers I know were liberal
arts grads and taught themselves on the job.

------
hrasm
Here is my take:

If you are just going to learn a programming language, there is still plenty
of competition. Instead, I would suggest that you build a web-based product.
It involves a lot of moving parts that you will get familiar with. It is quite
an arduous task.

Don't focus on the tool (programming language); instead, step back a little
bit, see the bigger picture and build something with that tool. People are
much more appreciate of such efforts.

Edit: In case you need some hand holding in the initial stages, I am more than
willing to help.

------
chubs
Here's my advice, on a slightly different note to the others: Learn how to
make iOS apps, and make a dozen or so of them (obviously, make them smallish
apps). Charge $1 each, and have a free/lite version of each app too. This will
teach you nontechnical but very important career skills: how to ship,
entrepreneurialism, and initiative!

As for your worries about signalling mechanisms, there are 4 SIMPLE answers to
that: github, meetups, stackoverflow, and apps in the app store. You sound
like a smart guy - get busy!

------
t_krupicka
Starting out I felt it was most helpful to learn at least the basics of build
up languages so that its easier to understand ones that are thrown at you.
Good ones to know are PHP/Python C++/C# and Java. My reasoning was that if you
work hard to gain an ok understanding of all of the different programming
areas, you can learn new aspects of the languages to suit projects you
receive. Hope this helps..

~~~
t_krupicka
If you set goals in each language (such as a functioning PHP website) and
maybe pick up a couple books I think your plan is obtainable!

------
brudgers
Start with CS106A through Stanford's Engineering Everywhere initiative. It's
free and world class.

<http://see.stanford.edu/see/courses.aspx>

