I want to be a software developer. Where do I begin?
i would really like to learn how to program and develop production-ready software. i would like to begin with PHP and either concurrently, or subsequently, learn python. how do i begin? the purpose of my learning is firstly to be able to personally work on developing features and apps for my e-commerce site which is based on joomla (it was developed by professional developers).. the second purpose is that i want to be able to apply for software/web developer jobs eventually because i'd like to work in that field.
i don't know if it's relevant but i'm currently using a windows machine, and i've often heard from people that windows is a terrible environment to learn programming and to program in. is it necessary for me to get a mac or linux machine?
and to reiterate: where do i begin to learn how to develop production-ready software, i.e software that is ready to be shipped? i've done codecademy and similar stuff before which seems really simple and easy, but i can't figure out how to translate that "knowledge" from those sites into actually writing something useful and "shippable".
64 comments
[ 2.8 ms ] story [ 61.4 ms ] threadBest way to learn is just by beginning. Set yourself a relatively modest goal. It can be useful even if it's modest. Something you need, maybe for yourself, or for some community you're in.
Being a "self-starter" is CRUCIAL to becoming a good programmer. You'll only discover your favourite languages/techniques/etc yourself by trying them out. No one is going to lay down the pathway for you (ie. Do X, Y & Z).
Windows is fine for development. I find OS X easier to configure but thats probably because I only switched to Mac after having several years experience.
There's nothing different than "production-ready software" and any regular old software. Production ready suggests that it has been tested - that's about it. Tons (in fact far too much) "production" undergoes no or very little testing so I wouldn't get hung up on labelling.
Make something, anything.
My approach to learning was to absorb as much as possible as fast as possible. I spent time trying to learn PHP, Ruby (for usage of Rails), and JavaScript. I did not do anything with NodeJS then, but I did learn how to manipulate JS to accomplish things I wanted to do. I did not know best practices, or was comfortable with OOP.
If you want to learn web development, try building the websites you want. That is probably the best learning experience to start.
- Start small
- Don't worry too much about the language
- Start with some free sources e.g. KhanAcademy, Udemy, libary books
- Have a very small project that you can use to learn
- Carve out some time each day/week to work solely on your pet project
- Ask questions
- Find a mentor
- Don't give up. Everyone starts at the bottom.
Start programming, make things, read things. Eventually you will realise that you're pretty good.
Be willing to put in years too.
Don't get tangled up on what's hip and cool now, it might be disastrous for someone just starting out. Here on HN especially, we obsess about exotic new languages and frameworks. But they often have very little support for true beginners. Even Rails/Ruby is a pain to setup and understand for a beginner, they make it look so popular and easy, but you'll quickly end up in a huge confused state of things you can probably not relate to each other.
PHP would be my suggestion, play with it for a month and try to get as far as you can, get a grip of how things tie together and such. Then, you can re evaluate what other languages might be interesting or why certain aspects of framework driven movements might make more sense.
Pick the easiest, oldest tool you can find and work your way forward, historically and all will make much more sense.
Disregard your environment that first few weeks, Windows totally works, you don't need a web server, just use something local. Your dev friends will tell you PHP sucks and ruby is the shit, but consider that this does not necessarily translate to "when just starting out".
The hardest part about programming is never the language. It's always the ability to know how to address a given problem, tactics. Later in life, you'll be able to use any language thrown at you, it's the problem approaching that really makes a good programmer. Learn concepts, how a web server really operates, how a browser works, that stuff. All a programmer does is building bridges between existing technologies and people (behavior).
No offense to PHP, but it really can't be considered hip anymore.
Good luck! Fail faster in the hands and care of those who are better than you.
Also see http://jenniferdewalt.com
I started with little things like a personal blog, tinkering with features on that, doing some fun and simple project websites, helping do HTML/CSS design stuff for other more complicated sites from friends (where you inevitably bump into backend and frontend code challenges) and then started building my own e-commerce site. Note that whole process was around 2 years. Get stuck into doing ALL of these things yourself (ie. front-end, backend, server setup etc.) because it will eventually help. I learned Python by proxy - starting with Django and then regressing into Python. I'd suggest you do something similar, because pure Python is perhaps too low-level for what you want right now (ie. pushing website code).
And yes, Windows is a bit of a crappy environment to develop in. Lots of great open-source software is written by people developing on Linux/OSX and as a consequence, their code/documentation/communities tend to ignore Windows. You'll make stuff work more quickly, more easily and with more immediate help from the internets if you're using Linux/OSX.
As for production-ready software, I'd start small then add things onto it. For example, if you have a simple Tetris game, try adding music or porting it to Android. Major software projects don't get built overnight and generally involve teams of experienced developers, so that's not something you're going to be able to do immediately.
You might want to look into Agile development methodology. That shows a way to go iteratively from initial idea to something a customer would want to use.
https://news.ycombinator.com/item?id=6094641
Are you still planning to return to school for a CS degree this January, as you said you planned to?
https://news.ycombinator.com/item?id=6450381
That would be a decent way to pick up programming skills.
and yes, i do intend to return to school but it would be in fall this year, not january because the school that offered january admission did not make me an offer...
Did you consider that the company hiring maybe saw potential in you? Or maybe even existing ability that you don't recognise (our industry is rife with impostor syndrome)?
Perhaps they realised you wouldn't be a lead dev but had you earmarked for a more junior role.
My basic point is: be optimistic and courageous. The worst case scenario is you learn something. If there's one thing I've learnt recently it's that no one will hold anything against you for taking a leap of faith.
On the other hand, if you're happy doing just basic programming in a single language, you can probably learn that without an expensive education. People do that all the time.
PHP is very popular with hobby programmers, so presumably easy to learn. I have almost no experience with PHP, but even Wikipedia uses it, so it's good enough for big stuff. There's lots of work in it, though my impression is that rates are a lot lower than for other languages.
Python is also a very good starting language. Very well designed, and it has the advantage that you're not just limited to the web. Plenty of games have also been written in Python, for example. Jobs seem to be a lot less than PHP, but that probably means that rates are better.
Another good option that might be worth considering is Ruby. Beautiful language, popular with hip startups, rapid development, but not great performance.
If you want to look more into enterprise web development (which you probably don't, but I'm listing it for completeness sake), you have to look at Java. Popular in introductory programming courses. Started out as a nice, clean language, but has been surpassed by younger languages in that respect. There's loads of work at very good rates here, though it's unlikely to be the most exciting work.
And whatever you do, Javascript is always worth learning.
Get a good book, look at all the online tutorials, look at the code of popular open source projects, and start making your own thing.
Even if you go to school for 4 years, you won't learn as much as you will by coding on a real-world project every single day...
I recently started a job(June) and honestly I didn't know how I was going to pull everything off that my boss wanted (A beatiful site design w/ lots of CRM functionality) -- I dug into Laravel a beautiful php framework and I spend everyday in IRC chat asking for help, delving through documentation, etc...until I'm becoming pretty good at it.
Last month we moved off shared-hosting to vps hosting, something I've never done before, did we get someone else to handle the server setup? NO! I did it. I learned a lot about devops, I installed Nginx, APC, PHP-FPM, REdis. I learned how to setup a mysql master slave replication AND how to make laravel play w/ it so that all writes go to the localhost slave, and all reads go to the maindb master.
I also have a redis server on the maindb server that is used for caching of laravel. I also had to diagnose and treat a major bottleneck(load time of 12s) -- now it's 100ms or less. (I was pulling in blog data from wordpress on every page load to integrate into the CRM -- now I cache it for 48 hours.)
Trust me I could never think of all these problems, but as I solve them I learn, and I figure out how to be a better developer, and even some devops skills --which can be very useful.
I took this job on the cheap $15/hour simply for the experience, when I finish the app to a good point as I'm the single developer, I'm planning on moving on to $40-50 an hour job, or asking for a HUGE raise. I also am working on Ruby on Rails side project in my spare time just to get some familiarity w/ that platform - the more you know.. Also I built some of the admin frontend stuff in AngularJS -- some cool filtering of orders filters as I type an email, or tracking#. So in six months I learned:
* How to setup, build, and deploy an enterprise laravel app. * How to setup an app server cluster, with a nodebalancer duplicate the content using Csync+Lsync, Secure the system using firewalls, changing ssh logins, not allowing root logins, etc.. How to speed things up by using Nginx instead of APache - and tweak the hell out of it. How to use redis as a caching engine. * How to use angularJS for a more dynamic front-end to my app. * How to solve ANY problem thrown at me. * How to test and diagnose problems w/ my app. (Learning to write better unit tests currently.) * How to manage a mysql server cluster. * Basic linux crap like ssh, scp, aptitude, etc...
I like Laravel a lot because it's built on php and makes php way sexier. But I also play around w/ other frameworks in my spare time.... I put too much emphasis on this though..
If you're interested, I could help you build your skills. Can't pay you anything, BUT we could collaborate on a startup/website idea, I've got quite a few ideas. I'll let you take lead on the app, and I'll point you in the direction you need to go, where to get help, who to ask, what's next, etc... you'll write most of the code, I'll critique, and give insight, give tips. Then we can deploy it, and I'll let you do that as well.
The key to learning super fast is for you to be FORCED by circumstance to do it, without hand holding - though I'll be hear to help, --but when nobody is doing it for you, you just pick it up as needed. Google/StackExchange and ESPECIALLY IRC Chat are your best friends on this journey.
if i'm understanding you correctly, you're offering to collaborate on a startup/website together where you will give me guidance but i will write the code for it, and you will basically review my code to determine if it's "shippable" and then if you say yes, we will let the code go live? that sounds like an interesting offer. can you teach me how to use github as well, so that this way we can collaborate more effectively?
thanks in advance!
Once you pick a project, just take it one step at a time, asking for help when you get stuck. Don't worry about making it production-ready. It's inevitably going to be full of vulnerabilities and bad coding practices, don't worry about it. There isn't a programmer on Earth who hasn't looked at their own code from 5 years ago and thought, "What on Earth was this guy thinking when he wrote this???" Build a few projects and you will pick stuff up as you go. Once you feel like you really understand what you're doing, then you can focus on making something production-ready. For right now, just get a few things built without worrying about the details.
Read this: http://prog21.dadgum.com/188.html
When you're starting out, do that. Don't worry about full understanding. Get a solution out there, even an imperfect and brute-force one. Obviously, you don't want to stay at that level, but like I said, you're going to hate your code 5 years from now anyway, so don't worry about it too much.
Read this too, the first quote on this page: http://www.goodreads.com/author/quotes/113989.Ira_Glass
i'll read those links right now! thanks!
For a blog, just make a new post page where you can type in a new post and then an index page that shows all posts. If that's too simple, make a log-in system and support for multiple authors.
For a calendar, just make it so you can click a day and type in an event which gets stored and shown when you load the page. If that's too simple, do multi-day events and recurring events. Or build a week view and a single day view as well.
This is the kind of project you would build in classes. It's the only way to really learn how everything fits together to make a full web app. Learning on the job is pretty much the only way to really learn software development.
You say you don't know how to apply those skills to doing something useful. I would start with an idea for something you want to do. You have an ecommerce site so I'm guessing you have some ideas for improvements you'd like to make to that site. I would start with one of those ideas (hopefully a reasonably simple one at first) then try to figure out how you would code that. Implement your change (in a development/test environment, not on your live site), do some testing and when you're satisfied your code is working push the changes out to your live site.
I'm not exactly sure what your hangup is about "production ready" code. As others have said there's no special magic that separates "production ready" code from any other code other than testing and reviewing your code to make sure you're following security best practices (which should be pretty easy with today's environments, the frameworks typically provide you with simple methods to sanitize inputs and prevent things like SQL injection). If you were building a site from scratch you'd have other things to worry about, like password handling and secure credit card processing but since you already have a site I don't think you'll need to deal with those more sensitive areas at first.
If you'd like to a have a professional spend a few hours reviewing your code before it goes live that's a service I can offer you. My website is in my HN profile and contact info is available there. Feel free to email me if you're interested.
when i say "production ready" code, what i meant was i want to be able to confidently list on my resume that i can write code that can be shipped, and to be able to actually legitimately apply for developer jobs. right now, the best i can do is finish codecademy exercises, which is not good enough.
thank you so much for your offer, and i might just take you up on it! you guys are so generous and nice here, frankly i'm quite touched and inspired to start right now.
I've never worked with joomla myself, but I'll try to give you a few ideas about how I would approach figuring it out if I had no clue and the documentation wasn't helpful.
The steps I would take are:
1) Get a local test instance of your site setup.
2) Figure out how to insert a line of code that generates some sort of output that you can see as soon as it's executed (ie. a "print statement"). Usually this will go to some server log file. There should be something in the docs, hopefully an example, about logging.
3) Make a guess about what code gets executed when a page you're interested in gets rendered. Most likely this will be the php file that you see in that page's URL.
4) Once you've got a first message to print out try to reason through the control flow of the code, adding print statements here and there to test your understanding of what gets executed when.
By following this approach you should start to get a feel for how the joomla code works and eventually you will find out where code for your new feature should go. If you still have trouble figuring that out try to find a similar feature already implemented in joomla or some add-on or extension and see how that was implemented.
If you want a recommendation for an IDE I've found that Eclipse with the PHP plugin works pretty well, but for this process of understanding the joomla code I would just use whatever text editor you're comfortable with, an IDE will probably only get in the way of your investigations at this point.
You should ideally try to get work at a software focussed SME, where you can learn from good developers, and slowly grow into larger and more difficult projects.
There are lots of different small software companies serving different markets. HackerNews and SV seem to be full of consumer targeted ones, because of the potential for rapid growth. But a lot of SMEs do B2B or government work, and you may find that because they are less cool, it is easier to get them to take you on. They are also more likely more focused on making good software and actual money, than building perception of growth to get a good exit for the founders.
At least round where I live, you can find these small companies in office parks and industrial estates. Find one that is doing something you think is cool, and vagually chimes with your portfolio. Then write them, and ask if you can do some kind of a placement with them. Try to talk to the engineering management, as HR just get in the way. Once you are there, and get on with the people, it should be pretty easy to get a junior role out of them at the end. If you are up front that you want this at the start, a lot of them will treat you more seriusly.
Think about what you can offer them - they will have projects, ranging from adding unit tests to writing a better time sheet system, that they would do if they only had time / free resources. Get them to talk about those things, and then sell them that you want to give it a go.
Other commenters - do you have any suggestions for a better way to make the initial contact?
but i will go ahead and contact some of these companies' engineering departments, i think it might be a good idea. do you have any suggestion as to how i should approach them?
I got my start at 14 knocking doors on a local industrial estate. I came across a little company developing java accelerator chips for mobile phones. Later they got bought by arm, and that technology became jazelle, which I guess opened the way for running Android on a little mobile proccessor, but when I was there it was 10 guys in a lab.
The CEO liked my enthusiasm, but I was pretty useless. On my first day, I tripped the power for the building, and on my second I injured myself soldering, and came in crying while they were negotiating with Samsung in the next room. Still got the scars. I hope at least they found me amusing.
The best way to get in somewhere small as an intern would be through your personal network.
Knocking doors is acceptable for children, but I think it would come across as for an adult. If someone you vaguely know asks their boss if you can come intern, they will probably say yes.
I'm assuming, from the rest of this thread, that where you are at is you are in your late teens, and thinking of going to college in 6 months or a year. Being so young is actually a big advantage.
People generally want to help young people. They have an expectation that you won't have much experience, but they will want you to succeed because they would have liked someone to help them when they were young.
If you don't have many software engineers in your network, go to local events, talk to people, and be up front about what you are looking for. If they can't help you, they will direct you to people that can.
Oh, and keep in mind that while at the moment web/apps are the big thing, software and engineering are bigger than that. It might be that in a decade, the big thing will be applying AI to data to help people make decisions. Or you might want to get into computational biology for drug development. Going to school is pretty important for that stuff.
I suggest to take CS61A by prof. Brian Harvey (it is available on YouTube) and then with understanding of why something is better than other, take a look at Scala and Clojure as appropriate tools to get shit done. PHP is a dead end, and websites could be built with Scala or Clojure too.
I wouldn't recommend Haskell before understanding deeply CS61A and SICP.
HtDP2 and related course on Coursera is another decent start, but the path described above should be taken afterwards.
I went with the last option. I spent many hours staring at the DOS based Pascal IDE and in-built help documents. I managed to create a few programs on that which laid the foundation for when I got into C++. After a few years of learning on my own I found that I could not find a job working on code until I got my education which caused me to go get a university education at the age of 26. Now I have a couple of years of development experience both using C++, Python, Javascript and a myriad of other supporting languages.
Today, all you need to do to learn to code is to code. You have the wealth of the internet at your fingertips. Choose a language, find a project and code. Create games if you have no ideas. Clone existing games (Like Tetris, Simcity or somesuch). In this industry the old adage "Mileage matters" applies.
Eventually, before you know it, you will be churning out production ready software.
I know I cant pinpoint the exact method I used to get there. All I can tell is that somewhere along the way, through millions of keypresses in multiple programming languages, I picked up the right habits.
You can do it to :)
Just go build stuff!
(Oh and regarding the operating system question. The OS does not matter at all. You can code in all of them. I started out in windows. Currently using linux for my dev work. Its just a matter of preference)
https://www.owasp.org is a good place to start.
Windows is just fine, it's a personal preference. I learned (mostly) on Linux but I use Windows at work, whatever.
http://www.ewanvalentine.co.uk/coding-your-own-career/
It's $10, shoot me an email if you'd be interested in a copy or have any questions!
Good luck on your journey as well!
I'll send over a copy as well, I'd be curious to get your opinion!
[1]: http://henrikwarne.com/2012/12/12/working-as-a-software-deve...
Most people want to start something new and quickly fall back into their old patterns that didn't include this new thing. You have to make time in your life so this becomes a consistent and ever present part of it.
So, my advise to you is to study for some period of time every single day, even if it is a 1/2 hour. Make it a habit.
Start with reading a intro level book and make sure that you get through it. Even when you don't understand what you just read. Just finish the book. Read it every day. Parts of it will be easy to understand and it will start to sink in. Then, do more.