I've studied with (now) engineers and there is large portion of people having a hard time with even the concept of a function. We learned C(++) at the time. I guess being forced to learn about what the hardware does kinda messed with people being able to just think about algorithms. As a first programmig language to just write some basic functions I like Python, but to be honest I don't understand what's going really going on behind the scenes either. But C is a really solid choice, as what's really happening is easy to reason about (at least unoptimized) and every other language will have to abstract these same concepts.
Programming
Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!
Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.
Hope you enjoy the instance!
Rules
Rules
- Follow the programming.dev instance rules
- Keep content related to programming in some way
- If you're posting long videos try to add in some form of tldr for those who don't want to watch videos
Wormhole
Follow the wormhole through a path of communities !webdev@programming.dev
Maybe a middle ground like Go.
So, of the two JavaScript, because motivating them to program is more important than anything else if they have no prior knowledge. javascript has great tooling and faaar less hurdles to get something going then C. Personally i'd go with TypeScript if it has to be anything in this family of languages, because making them think of types early on is helpful when moving to anything more than little web apps. If any other languages are considered, i'd go with python with type hints because it forces you to format your code somewhat readably (believe me, i know that it's possible to write unreadable python code) but is really low on boilerplate, has great tooling (at least third-party, use uv) as well as stellar IDE support and allows for multiple different paradigms to be explored.
Let them learn what they’re interested in so long as it passes muster as capable of sufficiently handling the concepts you wish to convey. Some will want low level, some will want an app, some will want to make games. The cross pollination of concepts will demonstrate that while languages may have individual benefits they should not stop at one.
TypeScript > JavaScript all day
If you also plan on teaching html and css, than I'd go for js first. Having your code instantly response in a visual way, is super motivating for most students.
If you just want to tech programming concepts, i'd go for python.
If you want this to be the start of a complete cs study, than you can start with C
That makes sense, I am also teaching html amd css first so I think JavaScript makes sense to teach next.
I was thinking about C because that's the first thing I learned in the college and that's my favorite language till this day.
The problem with C as a language for learning is that the error messages are not very specific or descriptive and often you need extra context to understand what is happening. Messing up memory management can result in inconsistent gremlin-like behavior from your programs, it can get very tricky. I had a pretty difficult time when I got to classes that taught C compared to other languages, but the main thing was just that I needed someone to look over my work and explain things to me because unlike with other languages, the self-service ways of figuring it out were much more difficult and it's easier to get stuck with no idea what to look into next. I ended up begging people online for help with understanding what was going wrong with my programs to supplement the limited amount of time the professor and TAs were available, really grateful to those guys as I probably would have failed it otherwise.
Anyway I would just say that if you do really want to go with C, I think you should be willing to put in more time to explain things to students one on one because many of them may need it.
If you teach them C, they will then be able to digest JS in an afternoon...
Why not python? C needs constant memory management and JavaScript is too chaotic. Both seem to me a bit too complicated for someone just starting
The main reason to not including python is that students aren't particularly in the CS field, they are learning it as their "augmented skill" (I don't know what it's called bad English). That's why I don't want to force them to learn CS concept which they might not even need.
I was thinking about C so that their fundamentals gets cleared but I think it will be too much for students who aren't into CS. What do you think ?
If they're not in the CS field, and you don't want to teach them CS concepts that they don't need, then you have eliminated C as an option by your own criteria.
With C, they'll have to learn about compilers, build systems, memory management, and pointers at the very least.
Idk why you are discarding python for the reason that makes python the best option. If there is a programming language that a non-programmer should know, it's python.
Python allows you to focus on a single concept in isolation (building on what you've already learned, of course). JS has a bunch of other stuff mixed in. Like the DOM. Interacting with the DOM is necessary for any browser code. You can hide it with abstractions and boilerplate, but it's always going to surface in error messages. Debugging JS can be quite a bit harder than other languages.
Caveat: beginner JS is many years behind me. It may not be as bad as corporate code full of react and angular and all kinds of requirements.
The main reason to not including python is that students aren’t particularly in the CS field, they are learning it as their “augmented skill” (I don’t know what it’s called bad English). That’s why I don’t want to force them to learn CS concept which they might not even need.
That's an even better reason to pick Python, then.
The main reason to not including python is that students aren’t particularly in the CS field,
In that case, I think Python is a better choice for teaching programming. Just skip the fancy features that have been bolted onto Python over the past 15 years or so.
I might argue in favour of JavaScript if web application programming is specifically the goal. But for programming in general, I consider it a troublesome language.
I mean, they'll probably learn more from C. But please. You can do better than javascript. At least teach them python or something.
JS is actually pretty great as a language these days.
It doesn't have to imply NPM hell. And it's got normal syntax and doesn't do Python's weird meaningful-indentation thing.
(It does have the == typecasting weirdness though.)
-- Frost
What level are your students (primary school, high school, technical college, university)?
You said it's not a core skill, so what is their core skill? IT? Machinist? Electronics engineer?
C is an excellent "fundamentals" language that anyone with a software engineering and maybe computer science should have exposure too, but if their programming is purely practical (e.g. scripting for IT?) C is essentially irrelevant.
Javascript is very narrow in scope but if they're web designers then it's essential.
I'll back the other commenters that if they need a language they can do useful things in (e.g. simple automations, calculations), Python is hard to pass over.
No way it's C. The average student will go home and find that they can't do much of anything they like, with the level of C they know. Even printing a string is famously hard in C, they'll hate it. Nothing drains their interest in programming faster than segfaults.
The average students wants to build games, websites, discord bots etc. Javascript makes it easy, none are easy in C.
printf(“hello world!”);
If this is famously difficult to you, I don’t think computer science is your bag.
C teaches a whole variety of low level concepts that are helpful in any comp sci field. That’s my vote. Python holds your hand too much and JS would require more to get started. If they aren’t shooting for a comp sci degree and are just looking for helpful scripts then python would be fine.
I would teach Typescript. Being able to write the types down and hover things to see what types they are will definitely help them.
I think C would put them off. I also wouldn't go with Python, in case they want to do things like write games or make websites, which are common tasks you can do with Typescript but not very well with Python.
What grade sudents is this for? Do you intend for this to be a dedicated class/semester or just a single unit? How good are they at operating a computer? (Typing, clicking, etc)
These are the questions that need answers before any meaningful advice can be given.
Probably JS as the fact that every computer has by default everything you need to execute JS. But there is a bunch of browser stuff you have to worry about before you can do anything with it. I'm not sure how you learn JS before html.
With Python you can do simple command line stuff without having to really know anything else. You can learn one concept at a time.
That being said, people have a lot of familiarity with browsers and it might feel less abstract. JS might a better choice for demystifying coding. Python is probably a better choice for accomplishing anything useful.
The answer is Python
Javascript is a horrible language, but it is ubiquitous. You'll want to spend a little time on html and css if you expect them to do more than print output.
You could focus on TypeScript, which will help them avoid some of the worst things, but then you spend more time on tooling and it won't just run in the browser console.
Python is a reasonably popular language with a good standard library. It has fewer bizarre quirks like adding two lists of ints together to get a string.
I wouldn't teach C to a general audience.
I don't know how old your students are, but there is also MIT Scratch.
+1 to scratch, I’ve used it to both teach kids at one of those “stem summer camps” and adults who do recruiting for tech firms. Both groups were able to pick it up pretty quickly
If you want to help people develop a fundamental understanding of IT concepts, teach them Python. C is very hard for beginners and will discourage most people. JavaScript is too inconsistent. Python will let people get results quickly and that way encourage them to carry on. Plus, it's one of the most popular languages out there so Python skills are definitely useful in the labour market.
Like a lot of people mentioned, there's a few good things you could start with, but C is probably not one of them. At my old job I ran a course for software engineer 2s to go over C, and even they had some struggles with it. If professional engineers struggle with C, it's maybe not the best starting point. Even C++ might be better, but still adds a lot of complexity that isn't necessary to know as immediately as the beginning.
Whenever people ask me where to start, I say python. It gives you a relatively tame taste of environment setup, and can run code very easily and flexibly. Its type system is flexible enough to make a user aware of it, without it being as rigid as C or as vague as javascript. Because there's enough libraries that are easy to pull in, even a beginner can start building useful programs without having to know how to build something equivalent to those libraries themselves.
Obviously if you want them to make websites, javascript will be necessary eventually, and isn't a bad place to start. If you're going purely for CS knowledge, I do think python is a little better; going from python to JS is probably easier than JS to python.
Neither. Teach them Scheme. They need to start by building good habits (functional programming).
“Learn the rules like a pro, so you can break them like an artist.” ― Pablo Picasso
Python. They'll only learn bad patterns from JS. Please teach bottom-up knowledge, not top-down narrow scope.
After reading through some of the comments, here is my opinion.
C would be a good language IF you know your students plan to get into IT, specifically a sector where the low level knowledge is useful. Beyond that, I assume your students probably use windows and I personally always find it a pain to work with C on windows outside of full IDEs like jetbrains and Visual Studio. It's also a lot more work till you get some results that you are happy about. Unless you start with an Arduino, which I find pretty nice to get students interested in embedded stuff.
I don't like JavaScript because I find it a mess although it is very useful for anything web related.
Given you said in another comment that this is meant to be a general purpose skill for your students I would strongly recommend python. While I dislike the dynamic type system, it is a very powerful language to get stuff done. You can quickly get results that feel rewarding instead of running into hard to fix issues that turn your students off of programming in general. Also it's very useful outside of IT as a scripting language for analyzing data in basically any field or for generating nice plots for some document
C takes the cake
bash
As a first language, JS is too much. They would need to learn three languages to make websites (JS, CSS, and HTML).
I'd start with Python. It's easy to learn, and modern Python gives you the tools to write code that's easy to read and follow without being too verbose.
uv should make things very easy to setup too. Install uv, then give them a starter repo with the Python version set. uv run should just work after that, no manual venv/conda/etc nonsense involved.
JS for sure.
It has a reputation among programmers as being a bit of a mess, but I think the reasons behind that reputation are largely irrelevant to your use case.
Basically:
- It has some bad decisions about basic stuff, like truthiness, equality, coercion. But those aren’t major stumbling blocks, really. When they run into those situations, they’ll probably already be aware that they’re trying something weird and won’t have the same already-developed intuition about “how it should work” that many of us are bringing to the table.
- Production deployment can easily turn into a Rube Goldberg machine. I think this is mostly what the kneejerk “really? JS?” response is about. Different ES versions, module systems, WASM, dependency hell, transpilers on top of transpilers, and a billion different runtimes. And the fact that everyone and their grandma apparently wants to build a custom DSL on top of JS that requires additional transpiler plugins or codegen steps. But your students won’t have to worry about that shit. Just pick one environment and do that. Maybe warn them that stackoverflow might use different syntax (require vs import) or try to import stuff that doesn’t exist in their environment though.
If there's a need to introduce students to virtual DOM, I'd choose a library that doesn't require language extensions or editor plugins, but allows to easily code with just the syntax of JS itself: properties as Plain Old JavaScript Objects, map/reduce with arrow functions, ternary operator, variables as usual, components as functions. Adding Mithril to existing WordPress websites for making dynamic parts such as calculators or quizzes was quite straightforward. On the other hand, its API is somewhat less convenient than what React offers.
I was taught a bit of C and still don't understand why. I see the use of C but it feels much too low level to be useful for the kinds of things I might want to do.
Python and JS are much more relatable.
Edit: I'm getting a lot of hate for this "hot take" for some reason. I don't know what to tell you, people learn this stuff differently. For me the "from first principles" approach framed programming as something I shouldn't bother with because it'd be forever until I learned how to do anything useful with it.
To me C and C++ seem powerful but it feels like having to invent the universe before I can get anything done. I'm not working on embedded systems or something.
Ill counter that by saying that because you started with something more low level, the other stuff was easy (my belief).
Also, depending on what the students are actually studying, I think you need to give an introduction to low level stuff because while some will want to do web dev for example, others might want to do low level stuff. Obviously if its a web dev course you dont want to do that, but if its something like CompSci or Software Engineering then i think having a grasp of the fundamentals of low level stuff is necessary.
Lastly, if its a general introduction to programming course I think C has advantages over other languages since almost everything is done by you, instead of the compiler (for example iterating over an array - C: you need to do the for loop to manually handle the data depending on whatever type is stored in the array - Python: for x in y is sufficient). Im tutoring my little sister in programming because they have it in school, and they use python. Sure its easier to get things done, but its harder to learn/teach general programming with python in my opinion. C would have been my choice, especially since at that level its not like you need to teach/learn memory management, or complex data structures. Its the same concepts as with python (input, output, variables, conditionals, loops, functions) but the syntax just doesnt hide too much from you, unlike python, making it easier to understand whats actually going on
I didn't find the difference in fundamentals between Python and C to be substantial. C felt similar but more unintuitive and more annoying to work with due to having to compile.
Understanding exactly how the sausage is made didn't help me in the slightest. It was needless complexity when I already had a lot to digest.
I understand your perspective but for me it was like throwing up countless roadblocks to the point where I lost all enthusiasm for the subject.
It was many years before I tried again, this time with JS and Python.
These days I'm a professional software engineer.