Advice for an aspiring programmer?
I'll try to detail my situation as quickly as possible, any input or advice would be greatly appreciated.
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.
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.
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.
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.
12 comments
[ 5.0 ms ] story [ 41.7 ms ] threadI 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.
Your path is not unrealistic, some of the best programmers I know were liberal arts grads and taught themselves on the job.
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.
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.
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.
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.
http://see.stanford.edu/see/courses.aspx
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.
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)
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!