Ask HN: I want a change in my life and become a developer
A quick background on me. I am a 31 year old male and due to illness in 2009 and 2010 I left my job as a System Administrator/IT Project Manager at a large Blue Chip. I now live with my partner and am a full-time Dad to my 2 year old son in West London.
As my son will be starting nursery next year and I am back in full health (have been for a while but wanted to spend time with my son while he was young) I am starting to think about returning to work. However I am not really that keen on returning to what I was doing. Not because I didn't like it, I did love my job but because what I really want to do is make things.
While I was ill and during my recovery I took my knowledge of systems automation with scripting/shell languages and picked up the basics in real languages (C, C++, Java and C# mostly). I really fell in love with it and while I have the time I would like to really "give it a go" as they say.
The problem is I don't have a software engineering or computer science background. I learnt to code with scripting languages on the job for sysadmin tasks on Windows and Linux. I know that when I code I do so in quite a hackish way. I get it working but obviously not in the best way possible. This sometimes comes back to bite me on the ass when it comes to adding features in the future so I would really like to spend the next couple of months getting some good patterns under my belt.
My question to the HN community is where do I start? I read up on algorithms and quickly get out of my depth with things like Big O, binary search trees, recursion, etc. All the things I never needed as a sysadmin.
Are there any good resources online for getting a basic but solid CS education? And is it realistic for me to be able to go from a hack sysadmin to a junior dev in 6 months or so?
Many thanks in advance.
12 comments
[ 5.1 ms ] story [ 34.5 ms ] threadJust build something. Don't worry about the details an how many O's it is. Find a tutorial on codecademy and have some fun with it. Figure out something _you_ could use in your day to day life and build an app/website/facebook thing.
This is just my experience in a SMB software company.
I also really enjoy C but I feel it is a language that requires at least some CS knowledge to really understand it.
I have pretty good PM knowledge yes, that does help me keep organised and break things up into small, manageable deliverables. I have also worked with developers so I kind-of get how they work, the thins I found hard working with them, etc.
Don't worry so much about what you "should" be doing and just have fun with it. I ended up making an Android app 3 years ago to help out my wife do "party sales". It ended up with 15k downloads. If I would have actually tried to turn that into a business, it might have actually worked. Was it good code? No. Is it on github. No. Do I say I had 15k downloads on an Android App at every meet up / interviews? Hell yes.
Here's a rant I did when my company was in interview mode: http://www.davepagel.com/?p=58. That will get you to where I'm coming from.
After that you should try to get through Ullman's Introduction to Automata Theory, the dragon book and Sipser's Introduction to Computation Theory.
Those are the 'core' elements of a CS education, although it misses everything to do with how your computer and OS actually works, but I don't know what to recommend for those.
Why don't you leverage your current position as an Sys admin/IT manager. As someone mentioned in the comment, programming is about solving interesting problems, and i am pretty sure you could find some very interesting and useful processes to automate in your current position. As a dev myself, a sys admin/Manager that could produce useful tools for us would be a god send and a very valuable asset to our company.The advantage of staying at you current position and evolving your job responsibility to include some coding is that you get to define and create exactly what software you want , using whichever platform/ language you want which avoiding the not so nice aspect of being a full time dev.
As for the ressources, i would check coursera. They have very good course on CS, especially Algo 1 which looks like exactly what you need.
So I learned to code.
First I built a flash game and tried to monetize it with ads. It took me two months. I posted it online and everyone hated it. They said it was the worst game ever. That put me into a deep depression for maybe a week. Programming flash games was supposed to make me money. So I wrote another game and took three months. It was much better and got played by 3,000,000 people. By then I knew some ActionScript 3 (actually a perfect starting point for programmers). I made very little money on either of these games but I did learn some programming and I now had a portfolio.
I tried getting contracts doing ActionScript 3 and they all paid like $15 an hour which was bullshit. Then I noticed that Flex 3 developers were getting paid more like $40+ an hour. By then I was so broke I was basically evicted from my apartment and was thousands of dollars in debt which sucked.
I already knew ActionScript 3 and Flex was ActionScript...so I started getting Flex contracts. I found an amazing little agency that gave me a break. I took on every project they had and every bug on every system, I didn't give a shit. Android? Fuck it, I'll read an Android book and fix some Android bugs. Ruby on Rails? God dammit I will learn some motherfucking Ruby on Rails too. EXT framework? I will fix some bugs in that too. I didn't care what the tools were I just did it.
Too many developer are either perfectionists (basically human robots with tunnel vision), anal retentive or permanently glued to a single tool they love...I was none of those things. I just did what needed to get done and learned whatever they needed to get fixed.
At first, I didn't even know what a Linux terminal was, I was using Windows up until that point. All the developers laughed at me for being the only asshat in the office with a Windows machine. It was embarrassing so I bought a Mac and used that to fit in and not look like a tool. I learned about Git and some basic Bash commands, enough to be somewhat productive.
I realized that, at that agency, I would never make it to the next level because I had no technical mentors to teach me how to do things right. I was just writing tons of bad code to scotch tape over the problems. If I was going to learn to code, I wanted to be the best coder ever. So I got a job at a more sophisticated agency which had much more evolved processes and more advanced talent. At that agency they trained me to be a deep iOS expert, I learned so much. I also learned PhoneGap.
By then I had built more apps being used regularly by millions of people on a monthly basis. I built an absolutely gigantic iOS application as well which taught me all kinds of core iOS frameworks.
At that time my lack of CS training started to become really apparent and started to hurt me. I looked into getting a CS degree at night but it was too expensive and my employer wouldn't help me. So I looked up their curriculum and bought all the textbooks used on Amazon and read them and intensively studied them on my own time.
I didn't just page through these books. I read the shit out of them. I underlined, I wrote notes in the margins. I made those books my bitch. I made that knowledge go into my brain so I could make more money and work on more high profile projects. Algorithms, data structures, graphs, operating systems, compilers, I learned it the hard way.
I went to some more higher paying interviews and realized that interviewing has nothing to do with platform knowledge of iOS (at which I was by then an expert). So I bo...
Find an employer (preferable in your contact network, not a friend as a favour type thing, but someone who) needs your previous skill-set, is happy to employ you for it, but allows flexibility in how you approach it (and key in this is, some office time 'developing' your role).
Ensure this employer has an easyish-to-kill problem that is in-line with your new role, ideally really hard for anyone else to fulfill, unless they have both skill-sets/knowledge domains. Implement your IT solution being both the expert and IT person, develop it to a prototype stage, get people satisfied it truly is better (this takes hard work, but is extremely hard for 'just skill-set A' or 'just skill-set B' people to deliver) and expand functionality quickly. As scale increases, delegate your past skill-set to new hires / new transferees, moving yourself to an oversight position. This opens the options of management if you'd like it, or technology specilisation by maturing the system and letting the experts in your previous domain take over management.
Sounds simple. Isn't. But it realistic and do-able. The biggest road-block I've seen is having enough time to do the transition and delegation of past tasks.
Seriously, don't do this as a favour of a friend. This is a leapfrog move, and you don't want to break their back, or get stuck in the mud after a bad jump.
Also, have a look at MOOCs on platforms like Udacity, Coursera, edX, etc.
Personal recommendation: read "Structure and Interpretation of Computer Programs" (https://mitpress.mit.edu/sicp/, you can get an epub elsewhere). It's one of the most important books around, MIT uses it for their introductory CS course.