22
votes
I want to learn programming
I currently don't know anything about programming so am considering picking this up on the side in case I loose my current job and need a backup plan. Anyone knows any good books or online courses or anything else for self-learning?
My friends said programming is too broad a subject and what you need to learn depends heavily on what fields you want to go in, which I'm ashamed to admit also know nothing about. So I guess I need some career advice too if possible.
IMO you should pick something that interests you as a goal of what you want to make. A video game, an app for your phone, etc. And then find the skills you need to build up to make that happen. Becoming a self-taught programmer is easier than ever in 2023 thanks to the wealth of free resources available online these days. But it can be overwhelming because a lot of them don't give as much context as a newbie might need.
If structure works better for you, you might want to pick up a course on Udemy or something similar. Take a beginner's Python course and see how you like it from there.
So much of this ^
My intro to programming was Java, 10 or so years ago. I learned to make Minecraft mods, haha.
In my eyes the most important thing to learn programming is simply to do - set a (hopefully reasonable!) goal, and learn as you go.
The hard part about learning programming is that beyond a few shared concepts, it is such a massively broad field, each subset of which can take as long as years or decades to master. It's very easy to get stuck in what's called "tutorial hell" and doing the same basic level stuff over and over again, and not knowing how to progress.
If you get past that, the other problem is that because programs often need to be 'exactly right' to work the way you expect them to, it's easy to get stuck banging your head against the wall doing something very simple. And when that happens to a beginner, often you lack the vocabulary and understanding to even figure out where the mistake is, formulate a question about it, and provide the necessary information for troubleshooting. That means that helping a beginner programmer typically requires looking directly at their code, which labor intensive for the helper, and relies on the skill of the helper as a teacher for the beginner.
In order to survive this as a new programmer, the easiest way is to be in a formal class with a peers and a teacher to help you; not to mention the structure to keep you on track and moving forward. If you can't do that, be wary of the step by step tutorials that hold your hand and tell you what to type -- unless you understand what you're doing, you're just paving the way to not being able to ask a question when something goes wrong. If you are using a tutorial, try seeing what happens when you don't follow the instructions (Does nothing appear? Does an error appear in the console?(What does it say?) Does it not compile? Does the program crash?). And then reading technical documentation is its own skill that nobody thinks to teach directly; it took me years before I was able to read the actual Oracle documentation for Java and understand it -- before that, I had to use the "higher level" (but less detailed and less exact) stuff like GeeksForGeeks that's easier to read
People also tend to neglect that learning programming also typically requires yet another set of skills for development environment setup and troubleshooting. Lots of beginner tutorials neglect that aspect entirely, and leave you stuck in their environment if you don't know how to transfer out. Actually, the first place I learned to program from was Khan Academy, and I ran into that exact issue; I eventually went to school for Computer Science though, and then I was able to move forward in a different direction -- the Khan Academy pre-practice and understanding definitely made things easier. Really though, if I hadn't had school tee'd up to teach me more, I can imagine I would have gotten caught in tutorial hell.
So what are good resources to learn? They all have their own issues. I liked Khan Academy for JavaScript because it was very clear and very thorough with fundamentals that apply to many languages, and it puts their documentation right below the coding window with links to read more, which encourages some early independent learning. I don't like that it basically 'strands' you into writing animated games in their coding window without really pushing you out elsewhere. I've heard that FreeCodeCamp does a good job at jumping right into projects that immediately build skill, but I recall trying it and really struggling with looking at a blank window on its first big independent project. (I was already in college at that point, but wanted to learn web development).
I never did get past that project. Years later, at a hackathon I built an incremental game with what I had learned up to that point, a CSS/HTML template that copied from some free website template, and some (under 15 minutes) help from a friend on how to modify the DOM from JavaScript. Eventually I got to my first job with that on my resume and got told "here, take this 40 hour long Udemy course to learn React". 9 months and a frankly ridiculous amount of code review and 1-1 support later, I had a web page and back end API that I had built and I could reasonably call myself a React developer. But that required all the skills I had at understanding how computers and programming language interpreters work, experience troubleshooting when my development environment didn't work (and then knowing how and when to ask for help when I was stuck), reading documentation, programming skills from other languages that I just applied to JavaScript... It's kind of like the story of the repairman hitting the machine to fix it and charging $300 for fixing it; the valuable part was knowing where to hit it. Learning React well enough and quickly to use it for something real required the background.
So yeah... I'm not sure where to conclude after all that. I guess that "learning programming" without someone guiding you directly is difficult. I didn't want to discourage you from this path, but I think your first task needs to be narrowing down the scope of what you want to learn.
Lots of good things in here.
I’ll add a few things I learned myself that might apply to someone learning programming. These are just general things to keep in mind.
At first, unless it clicks for you immediately, a lot of things are going to make you feel dumb. That is okay.
If you hit a wall and you absolutely cannot figure out how to solve a problem, don’t be afraid to walk away. This applies to both immediate problems and programming concepts at large. Many times I’ve been frustrated to tears only to walk away and “get it” some time later. Sometimes this process took days.
Speaking of frustrating, it can be very frustrating. And if you enjoy solving problems, very rewarding. But sometimes the only thing that is going to push you through the pain is the will to learn. It’s not for everybody.
Don’t feel bad if you have to hit reference materials often. There’s so much going on, it’s easy to forget even basic things from time to time.
It's not quite the same thing as what you're asking for, but there was a topic from a few weeks ago that may still help you get started.
https://tildes.net/~comp/15aq/resources_for_learning_to_code
The link that @cfabbro posted has some good resources, but I want to caution that the days of companies throwing bags of money at novice programmers are probably over.
Your friends are correct. Programming is a vast field, and the various subsets require different skill sets. Perhaps you would get more relevant advice if you shared what your current field and interests are?
I also came across that thread back then too (thanks @cfabbro for the reminder), there are a lot technical advices there but everyone also more or less stopped short at "you need to figured out what you want to do first", which is my predicament because I don't even know what's out there to even have a preference about. My irl friends were also the same way. It seems as if people have to started out already knowing what they want to do otherwise there's no way in.
My current work is technician for a biotech lab, I mostly work with chemicals. I guess I don't have any interest yet since I come at this question primarily out of pragmatism and not passion. Hopefully I'll develop some interest once I start learning something, but that lead us back to the issue of "in order to chose what to learn, I need to know what I want to get into first". It's a catch-22. Maybe if there's some kind of guide for potential fields, what's required and what to expect entering those fields, etc. to serve as a starting point.
What you said about no easy money for novice also worries me. I don't need high pay or anything like that, as long as it's enough to survive. Though with the recent layoffs and the future prospect of AI cutting off opportunities for low level jobs, it doesn't seem there's much hope for outsiders like me.
Ok, so you're a lab technician. What parts of your work do you see as being repetitive and would benefit from being automated? Or, what processes in your work would yield better quantitative our qualitative results if it was done by a machine? Maybe you use Excel for organizing stuff, but some of that organizing could be improved and cut time on your work if it could be better tailored to what you do.
That's just some ideas, I know nothing about labs or chemistry. The point is, coding is just the latter half of what entails programming. The first part is being able to identify problems and working out solutions to those problems at a high level - and then in the latter half you basically translate these solutions into code.
There's no such guide I'm aware of. "Software" as a field is too broad and vast.
Maybe try your hand at a few different types of coding. Do you play any video games? Make a mod. That's how I got my start; making custom servers for Ultima Online via a community-developed emulator.
Got any hobbies? Make a website about them.
Look at it this way: "AI" might change the field, but actually typing the code into the computer isn't the hard part, and that's the part that chatGPT and friends are good at automating.
There was a brief period where you could do a "javascript bootcamp" and learn the absolute basics of web development in 2 weeks, and there were companies out there who would pay you high five figures with nothing else under your belt. Those days are over for a multitude of reasons, of which AI is only one. The field itself will persist, but you're unlikely to get a development job at Google with only a bootcamp certificate.
If you're a lab technician, does your lab have any custom in-house tooling? For example there was a post on hacker news a while ago about someone whose shop used a raspberry pi to automate and interface with a bunch of test equipment, and of course that means someone wrote the code that manages that interaction.
You could see if there's anything similar in your workplace, where the venn diagrams of what you already do and software overlap.
It is a catch-22. Most people who get into programming "out of passion" started programming because they needed to in order to do something else. Often, making video game mods, but also various types of data analysis or presentation.
I agree with opcode (side note: I'm new here, how do we write user tags?). Try writing some things. A text-based daily planner / Todo list / organizer is a good general purpose introduction that doesn't require anything fancy or specialized knowledge. If some parts of your job are repetitive or boring, you could try automating them. Don't be afraid of spending more time automating a task than it would take to do the task yourself - lots of us do that for a living :)
When writing a comment, you can click the "Formatting help" link to open a new tab with a handy reference to Tildes' markup.
Edit: IIRC u/ also works as an old measure for reddit users. u/FlippantGod
Ah, I'm blind. Thanks!
When you say you "don't even what's out there," is part of the issue not knowing what all the different programming languages can do? Maybe this might help you: https://www.futurelearn.com/info/blog/what-are-different-programming-languages-used-for
Your pragmatism is what's throwing people off, because to us programmers, what you intend to do does not sound pragmatic to us at all. Learning a programming language as a career backup is not as easy or quick as you might think; it's really rare for people to go that route and actually pull it off. They're taking the ultra-practical route by asking you what you want to build not to deter you, but to ensure (hopefully) that you won't hate that first language you try...and quit out of frustration. Because that does happen, and it's a cryin shame.
That said, do you have interest in web development? This very web app you're using right now, tildes.net, was written in Python. You can also create web apps with Javascript, which is super heavily used these days. If you're interested in game development, most AAA title game engines are created with C++ or C#. Also Python or Javascript in some cases. Some languages are pretty versatile.
My point is, maybe think of something you like and ask yourself if you wanna learn how to build/work on something like that.
Difficult to see. Always in motion, the future is.
One thing is for sure is that tools like GitHub Copilot are only going to improve, and productivity will likewise also increase.
I'm an aerospace engineer by education, and they saw the similar thing in my industry before I was born, when the advent of CAD tools meant what used to take a whole floor of draftsmen a week now takes me an afternoon with a laptop.
Hi! I'm a self-taught software engineer.
As others have mentioned, there are various specialisations within programming, and they each have their own languages, tools and cultures.
Frontend. This is about the visible parts of a website: what you see in your browser. The big language here is JavaScript, with HTML and CSS playing supporting roles. You need all three languages to build a frontend. HTML is about what's on the page, CSS is about formatting, and JS is about how it bahaves and interacts. JS isn't a well-designed language, so there's a lot of 'frameworks' out there, which are basically big bundles of all the code you need to write for every project, no matter what it is, to save you some time. There are also some derived languages, specifically TypeScript and PureScript, that fix up some of JavaScript's problems.
Backend: This is the invisible part of the website, and my specialisation. There are a lot more languages here. I use Python at work, but Ruby, PHP, Java, and C# are also popular choices. You will also want to learn SQL, which you can use to talk to a database, to store all the information in your website.
Full-stack. This is basically frontend plus backend. Frontend programmers have started dabbling in backend stuff using something called NodeJS, which allows them to run JavaScript in the backend. I don't like this.
Mobile/apps. This depends on which side you want to work. iPhones and iPads used to be programmed using Objective-C (and you HN still use this) but Apple wants you to use Swift now (and people apparently like that). Similarly, Android apps used to be programmed in Java, but now Kotlin is preferred.
Systems programming. This is all about foundational programs like operating systems, database engines, web servers, and language compilers and interpreters. The important languages here are C, C++ and Rust. Newcomers are Zig and Nim. This gets you right into the details of how computers work, and I find it really interesting, though I work at a slightly higher level.
Embedded This is about writing programs for microcontrollers rather than microprocessors. These are the chips that control, say, your washing machine. Microcontrollers are very limited in their computing power, but you can connect them directly to electronic components, so are good for building your own hardware. The only language of significance here is C.
My advice: pick one or two of these specialisations, and look at some of the free tutorials that are on the web to get a feel for what they're like and what ideas are important in each. Once you've narrowed down your choices, we can give you some more specific advice about learning resources and tooling.
Think of it this way, if someone said I want to get in the biotech field by self-directed learning, without knowing the various professions/focuses or formal education, what are some resources you could recommend?
Personally I would start with what overall problem are you looking to solve? If it's just knowing a skill that can help you land a new job, personally I would go to LinkedIn or other job site and look for Software Engineer jobs and see what is in most demand and then use search youtube and sites for tutorials on the languages and topics mentioned in the job descriptions, also update this thread with some topics.
One of my observations is that the vast majority of the people in the industry started by either being curious and wanting to tinker even if it wasn't towards anything productive and/or they had immediate problems they wanted to solve and simply read whatever they could to learn how to solve it. Very few of my peers are in the industry because it's a paycheck, the few that I've met quickly moved on to different non-technical roles.
As others have said, programming is a large field. You might consider narrowing your choices by leveraging your biotech experience with a career in applied data science, for which you will need to learn programming and/or AI technologies. The following is an introductory article:
All good comments so far. I'll give some input from a different angle in terms of languages.
There are obviously many programming languages. There are some aspects of languages that you might consider along your journey to learn to program.
One aspect is building systems and dependency management. You typed up some code, now how do you run it? Some languages need to be compiled before they're run, some can be run by an "interpreter". Many languages have a "REPL" which allows you to write code line by line and immediately see it run. Some languages like JavaScript are easy to run in one way (just open your browser to the dev tools and start typing away), but harder in other ways (node, polyfils, etc). Then there's a question of "dependencies", say you want to use some code someone else has published along with your code. Some languages make it easier (I'll say easy in terms of how much more you need to learn to make it work) than others to do this for a beginner.
Another aspect is language features or abstractness. Languages like Python and JavaScript are very abstract and loose. There are minimal concepts to learn, but you lose the benefits of other features and safety. Beyond those you might add in minimal typing (the ability to differentiate a number from a word for example) and have something like Go. Some low level languages like C will also have memory management (the responsibility to destroy things you create so you don't have too many things piling up). Classes help you organize data, you can find them in Java without memory management, or in C++
with classes and memory management. Some languages like Scala have all kinds of features an syntax innovations whose influence you can see in many other languages. And there's threading and syscalls and I could go on.
So in conclusion, you might start with a basic language like Python, but make it a goal to learn a more advanced language like Scala, since the concepts you learn there will make it easier to pick up other languages across the spectrum
A lot of people have covered most of the more mainstream stuff, but I'll add my route for a few reasons. Namely suggesting VBA in Excel OR JS in google sheets.
I started my main journey into coding (ignoring some java classes that didnt stick) through VBA, via Excel. A big hurdle for me was "what would I even code" and so often times i'd go through some tutorial, get a working hello world/counter app/snake game/whatever, and then never really touch it again (or get way out of my depth fast).
While stuck doing tedious data entry in excel, and having messed with the macro recorder a bit, I felt that there had to be a better way to do some of the tasks I was trying to accomplish. This led me down the VBA route, and then eventually to C#/Python and currently F# (which is lovely, but may not be ideal depending on your long term goals).
The nice things about VBA, although dated were that -
I actually knew what I wanted to do. Often just "hey every time X occurs in Y column do Z" logic but it was a super solid starting point where I knew what I wanted to do and knew if the output was correct/
Tasks were very bite sized, and the macro recorder could help fill in blanks when i was learning (sorta...it has its flaws in how its handling inputs but for a beginner its fine).
It wasn't changing underneath me. I just needed excel, and VBA wasn't going through constant feature updates anymore.
Related to 3, although i found most of it AFTER i'd made the jump out, there's a TON of great documentation and videos for VBA. Any question you might have probably has a well documented answer and it hasn't magically changed in the last 2 years. I could ramble all day but pearson for docs and The Dev Owl for videos are two excellent starting points.
Now, there are downsides to vba, but it's a better language than people give it credit for. It's most glaring omission is in how it handles errors (no try catch) and having to jump through small but annoying hoops to get standard features like dictionaries.
This is why, although i've barely touched it, I recommend google sheets/js as an alternative with similar advantages. My brother did what little coding he's ever done in that environment for a similar reason (obvious business need that clearly could be made easier).
Either way, hope you find something that sticks for you. To throw a few other random ideas out there' "Automate the Boring Stuff with Python" is a pretty great book for getting some useful business side coding under your belt quickly, and I always recommend sqlzoo or some other sql resource to start learning a little bit of sql, as its very very useful.
Good luck
Khan Academy has some courses on programming. They teach programming in javascript, which is a smart choice for a beginner, because you don't need to install anything. Everyone on the internet already has javascript installed - people talk a lot of trash about javascript, but it is the lingua franca of the internet, and you can get nice-paying jobs writing javascript.
Since javascript runs in your browser, you can also practice your HTML and CSS, and try building some static web pages. Then you can add nodejs to the backend, or learn php.
Another option is to start going through H2DP or the classic, and still respected, SICP. If you try the SICP book, know that you can install Racket, and use drracket to install the "SICP" language, so you have a scheme language the matches exactly the language used in the book.
As an aside, a cool thing about Racket is, it makes writing programming languages easy. To that end, there is another racket book that explores this side of things, called Beautiful Racket. This is probably on the more advanced side of things though.
Another thing that will be valuable to a new IT career is linux knowledge. My linux knowledge has definitely helped me. A good starting place is linux journey. Youtube and linux forums can help you when you get stuck. If you're using Windows, you can install WSL to start, but WSL will always pale in comparison to a full linux install.
When you've learned linux, you might also want to learn php and python, for building websites and running scripts. And then maybe java, and c, and ruby, and lisp and... well, that's how my journey went pretty much.
This is a good time to bring up a past thread on resources