I need some general advice on how to continue my programming studies. I'm a self taught programmer and I picked up programming somewhere in the fall of 2011. I began with C++ and Java books and I learned everything up to OOP (except memory handling in c++). I later decided that I wanted to work with web-development so I learned the PHP syntax and started my first project in the summer that resulted in http://doostr.com (obviously work in progress)

The main reason why I started the project was that I would be forced to solve different kind of problems that I knew I would face along the way. I learned about relational databases and designed my own tables in MySQL (third normalization form), learned SQL logic and functions, became more fluent in programming by extensively utilizing basic programming tools (variables, loops, arrays, functions, classes), PHP native functions, MVC, Javascript (jQuery library) and the basics of CSS/HTML. I've used twitter-bootstrap as a base for design since I wanted to speed up the design and focus on programming.

Now I feel like I'm just iterating through things that I've learned before. I feel like I need to come in contact with more experienced programmers in a professional developing environment that I can learn more from so I'm preparing myself for applying for a backend programmer trainee job (unpaid) and use my project as a resumé (I dont have a computer science degree).

I need some general advice from working professionals on how I not only should prepare myself considering what I want to work with, but also how I should continue my programming/developer path generally. I've asked a friend that works with java and he said that I should find a good design patterns books. You guys have any good suggestions? Any other language that would be good to combine with PHP/MySQL? I know Java/C++ syntax. I'll take any advice you might have. You can go to my site, create an account and test the functionality and it might give you a hint of what I'm capable of.

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
If this question can be reworded to fit the rules in the help center, please edit the question.

4 Answers
4

Write code, thats the best way and try to learn a few different languages, not to many though!

Think before you code! Dont just write something that works, try to think out how to solve the particular problem at hand.

Finish your projects! Don't just leave them when they get boring or when they work! Refactor and improve your code. Learn to do this early, it's way better than trying to cram in designpatterns into your code, leave that for later.

Try to keep up your passion for programming, actively discover new things and discuss programming in general with your friend.

Don't be to hard on yourself, but more importantly don't think to highly of yourself. And don't take it too personal if people think that your code is crap, instead try to learn why they might think so.

As a self taught developer working in a professional environment, I can't stress enough how important is to be willing to try something new. Often, when I am mulling over the design of my project or actually implementing it, I will think "there has got to be a better way". That leads to a Google search and I will usually learn something new which completely changes the way I think about and write code.

Most higher level concepts are already solved with frameworks for the language. Some of the higher level concepts I have only recently learned about are:

Design Patterns: Your friend is right about theses. If you are writing code in C++ I would definitely recommend a reading book on design patterns. If you plan on working in a higher level language, I've found that many problems that design patterns solve are already taken care of in some form or another by the language its self. That being said, the factory pattern is one you should learn about right away for any language.

Unit testing: I can't believe how many fewer bugs I have when I just right unit tests for classes and functions. Unit testing pushes you to write smaller functions which helps you follow the Single Responsibility Principle. This leads to more modular, more bug free code.

Inversion of Control: This concept has blown my mind and opened to door for so many cool design possibilities.

Mocking: Used with unit testing, but I had no idea it could be so powerful and it's made me think differently about the design of my objects and how to test them.

Functional Style Programming: Learning a functional language shows you that writing code and manipulating data is more than just a for loop. It gives you a different perspective and helps you think out of the box.

My senior developer recommended I look into Clojure as a functional language to learn and I have thoroughly enjoyed working with it. Read the rationale for Clojure, it has some interesting ideas about the future of programming and the problems with state. Most of the topics I mentioned have frameworks that accompany them; just do a Google search on the topic with your language of choice and read up on the frameworks and the problems they solve.

First of all, you are too broadly committed. You are learning on the PHP track and the Java track. To advance your skills you need to pick one track and run with it. (Whichever path you choose, you'll still need SQL, HTML, CSS and Javascript/JQuery Here is a list of skills you could work on in your chosen language.

AJAX - Learn how to write a client side AJAX call to a service you create. Use the data to dynamically alter your HTML and/or CSS using Javascript.

Web services - Use your service side to call web services to get data to drive your application. e.g. Google Maps to get location data, Amazon S3 for cloud storage.

Deployment - Learn how to deploy your software to Amazon EC2, and Heroku.

3rd party authentication - Learn how to use OpenID, OAuth or LDAP to authenticate users into your web application.

Learn how to scale your software by using a reverse proxy to add multiple instances of your web server.

Learn how to scale your software by adding work queue and a worker process to handle long-running jobs.

Learn how to interface to SMTP/POP3 servers to send and receive email, and learn how to use Twilio web services to make phone calls and send SMS messages.

Learn how to normalize your data to 5th normal form or even DK/NF.

Learn how to generate PDF files from the data in your application.

Learn how to generate graphs and other visual reports for your data using free graphing or plotting libraries.

Web development is a good choice since people tend to be less picky about alma mater or whether you even have one as is my case. From where are you now, however, I would stop a moment and consider what aspects of what you've done so far interest you the most.

Pick a focus. Server or client-side. I can tell you this. I asked a chat room full of client-side devs recently how many of us had ADD and damn near everybody said yes. Juggling one programming and two markup languages while writing code for browsers who don't all agree on what methods are available (or in the case of older IE how a lot of them even work), all while solving challenging UI problems takes the ability juggle a lot of things in your brain at the same time. Did I mention there's craploads of new stuff to stay on top of constantly? It's awesome. Or miserable. Depends on your brain I suppose. It's okay to be a generalist, but it's better to be great at one first than kinda okay at both so start with some focus.

Pick one language that interests you and become very strong at it. Get the reference book and skim regularly until you've at least become somewhat aware of everything it can do. Don't memorize, just know what's possible so you can Google when it becomes relevant later. And of course write code with it. It doesn't sound to me like you've done that yet. I've seen your jQuery and you never really hit pointers in C which are not a minor feature of the language. Knowing one language really well, will help you understand other languages, which in turn will give you insight into the original one you got strong at.

At least dabble in a language that doesn't have a C-based syntax if you haven't already. It's helpful to get your head out of the syntax so you can see that while Java and JavaScript might look similar, they're basically on opposite ends of the language design battlefield.

Really learn OOP. It's not merely about sticking stuff in classes and popping out instances. Java Beans and getters and setters used willy-nilly murder OOP. More devs should understand that than do. When you're halfway there, look into design patterns. Trying to understand them better will help you understand OOP better which will finally help you understand Design Patterns as ideas rather than recipes. It's okay if you don't fully grok all of this before you've actually picked up your first job. Just stay on it. Also the original design patterns book really lays down some excellent core principles that apply beyond OOP. I found Wikipedia was handy for clarification of stuff.

Learn how the web actually works. No really. Start with HTTP. Everything else follows from that.

Be interested in how everything works. One thing I decided not to pester you about is that I get the sense your focus has been more on making things happen than how they happen, at least on the client-side. Put some focus on how they happen if you haven't already. There's a difference between knowing how to use jQuery and knowing what it is, how it works, and what problems it actually solves. It's the difference between knowing what to do when stuff actually gets complicated, needs to perform well, or needs to be obvious and re-usable to another developer.

Thanks for your input. I want to focus on server-side. I like to solve "problems" pragmatically. I have some client side knowledge and the ones that I'm most interested in learning more about is how to collect 3rd party data/authentication etc. But I need to focus on one programming language as you and someone else mentioned and becoming good at it. I'm going to pick up intermediate/advanced OO PHP books and start reading/doing exercises. is it possible to add people as friend in here? Can I add you on skype/msn/gmail? Would like to have a list of mentors somewhere :)
–
user1924247Dec 23 '12 at 16:34