Ask HN: How can I become a self-taught software engineer?
Software development is a vast field, without countless options to explore later, far too many to give a good long-term plan at this early stage. As you say, what you need is a place to start.<p>There are many languages, each with their own pros and cons, but Python is a safe bet for your first one. It’s useful in its own right, and it’s also reasonably mainstream in its ideas and techniques, so you can learn a lot of transferrable programming skills. There are plenty of decent tutorials around both online or in book form.<p>If you’re planning to follow the self-teaching route, I suggest that the single most important thing in the early days is to just keep writing code. The theoretical foundations are useful, and important for a lot of professional work, but IMHO there is no faster or more reliable way to kill a new developer’s interest in the field than to bog them down with “doing things properly”. You have to <i>make stuff</i>, to experience to joy of programming and dispel the illusions about it being some sort of black magic. Everything else can wait, and this way when you do get to more advanced theory and more sophisticated tools and more carefully structured processes, you’ll have enough experience to understand why those things are helpful (or, in some cases, why they aren’t and you don’t need to get bogged down with them).<p>You have to start with the “Hello, world” stuff. This is trivial, but it takes the important step of writing and running real code on a real system, and therefore knowing that you have the tools you need available. Any tutorial is going to begin at that kind of level in the first hour. But then over the next few weeks and months, my recommendation is to try a few more substantial projects in different areas to see what you enjoy, and for a while, just learn by doing.<p>If you enjoy things like computer graphics and pretty pictures, and you’re comfortable with math, you could try something like rendering the famous Mandelbrot set, or generating a 3D landscape with mountains and lakes. As a novice, you can probably still write a program to do either of those things within a weekend with the help of online tutorials. This sort of exercise will give you a chance to exercise your basic programming skills, but it will also introduce you to essential ideas like how to use libraries of code that other people have written to do things like drawing on screen or reading data from a file or fetching data from an online source or countless other useful things.<p>If you’re interested in gaming, you could try something more interactive. Try implementing simple games like snake, 2048 or Tetris. Again, these are projects you can complete within a few days, following a path many have walked before so there are plenty of hints available with a bit of searching if you need an idea of how to get going. These will further exercise your basic skills and use of libraries to avoid reinventing the wheel, and in addition you’ll have to think about how to structure a non-trivial program that has some interactive input and output to deal with.<p>If you want to try some web development, you can write a simple database application. An address book is probably the classic exercise. You’ll need to learn about a few other tools in addition to the pure programming aspect in this case: you’ll need a server (even if it’s just your own development PC) running both web and database server software, you’ll need to figure out how your Python code fits in with those other programs, and of course you’ll need to know enough basic HTML and CSS to build a simple front-end. That’s quite a bit of non-programming knowledge, but on the other hand, again it’s something you can find your way around within a few days and the experience will be valuable if you ever wind up writing almost any sort of server software, whether it’s sitting behind a web site or not.<p>If you prefer native software rather than the web but want to try something more substantial, another classic exercise is to write yourself a simple text file editor. It doesn’t need to be anything flashy, but again there will be interactive elements and you’ll have to think about how to organise a slightly larger amount of code. You’ll also have to deal with things like reading and writing files, which brings with it the possibility of things going wrong and needing to recover from errors, as well as working with larger amounts of data, where the simplest and most obvious structures for that data don’t scale and you need a slightly more sophisticated approach. Again, these are all import general ideas that you’ll encounter time and again, and while of course you won’t yet know a lot of the more advanced techniques that real world software like this would use, you can start to develop an appreciation for <i>why</i> sometimes the simple and obvious approach isn’t effective enough and how more advanced techniques can be useful.<p>If you want something a bit more substantial that combines a few different ideas, you could try writing yourself a simple spreadsheet that can manage a big table, let you write some simple formulae to generate data in the cells (which introduces another important general programming skill, the ability to parse structured text input), and draw some simple charts of the data, as well as reviewing things like saving and loading data either using files if you do it as a native application or using a database if you do it as a web application.<p>If you try a few different projects like these then somewhere along the way you will also start to run into recurring questions about how to organise the structure of your code, how to investigate when things aren’t working properly, how to keep track of changes in your code over time, how to combine your own code with the tools provided by your programming language and&#x2F;or libraries written by other people, where to find more detailed information about your languages and tools and how to navigate that information, and so on. At that point, you should be in a better place to start exploring more powerful tools and techniques on your own. Hopefully you’ll also be starting to get a feel for which areas of programming you do or don’t enjoy, and can branch out into other areas like mobile app development or machine learning or natural language processing or making big data visualisations whatever else takes your fancy.<p>Around that time, you might also like to experiment with additional programming languages. I would recommend trying at least one more that is quite similar to Python, so you can see how much of what you’ve learned transfers around between similar languages, and at least one that is very different, because there are vast areas of the programming landscape that Python doesn’t really address but other languages and tools do. For example, it would be hard to go wrong with learning a bit of C at that point, both because it’s also widely useful if you’re working closer to the metal (embedded software, operating systems, networking, device drivers, etc.) and because C is the <i>lingua franca</i> of the programming world and if you ever need to build larger systems that involve multiple programming languages then knowing C will almost always be useful for understanding the bridge between them.<p>Hmm... That turned out to be a much longer comment than I expected, but I guess it sums up my general advice to new, self-teaching programmers fairly well. Good luck!