My approach is to employ folks with enthusiasm. If they're teachable, they'll figure out whatever pile of tools they get thrown into on the first task. Then they'll have some skills and the next task will seem less daunting.
Of course some mentoring is useful. But just the stuff that's pertinent to the task at hand; concrete help that gets them moving forward. Because, somebody is paying for results. And because producing results has a very positive effect on confidence.
I just offered work yesterday to a young person helping me at a big box store. I mentioned I was buying a device to test an Android build, and they got excited and started making cogent comments about the tool chain and devices available. I game them my card, and when they graduate in 3 months (from a local community college) I'll find them work on a client's contract.
The first project will cost me more than I earn from subcontracting them (because it takes me away from my high-rate work I would otherwise be billing). Maybe break even by the 2nd. But it's a sort of enlightenened-self-interest thing. If young people get into the field, everybody benefits.
And of course as an old guy with resources, I can afford to take some risks. Because it's everybody's job to look out for the other guy.
I ask because my experience wasn't the same so I'm interested in other perspectives.
One experience that jumps to mind right away - a few years back I was in charge of mentoring a group of interns. The thinkering/enthusiastic guy was smart and reminded me of myself at that stage - but I was a terrible employee at that point and it took a lot of failing to get productive, and this guy had all the same faults - overcomplicated things, didn't focus at task at hand, wasn't paying attention to requirement details... all this made him unreliable and a pain to work with.
There was one guy in the group who was average capability/enthusiasm but was hard working and focused. Wasn't the fastest to figure things out but if I left him with a problem I could see he put effort and tried to pay attention.
I've done this dozens of times. Somebody needs a break, and I have an opportunity. It's not a zero-sum game. That's the realization I made very early in my career.
It sounds a bit like you got things the wrong way around. The guy who reminded you of yourself needed more mentoring, and the other guy was doing just fine.
I think the issue is that if you're smart and haven't failed yet it's hard to internalise such feedback/criticism in a constructive manner (when you're usually right it's easy to assume you're always right). Giving someone the opportunity in which they are likely going to fail over some who's just going to do what's necessary is hard.
Enthusiasm is perhaps the easiest thing to fake in an interview, and something many of us fake automatically, as smiling and seeming engaged is something a lot of us learn to do when meeting new people.
I doubt it correlates with productivity outside of something like a sales role. Most of the world's work seems to get done by people who don't appear particularly enthused.
Consult your own memory? Not being enthused doesn't imply you're totally apathetic. We all do plenty of things we don't enjoy, and aren't interested in, because it needs to get done.
> Most of the world's work seems to get done
> Consult your own memory?
For sure, I can use my personal truth to answer my question. Still, vague information, including the entire working population, has been mentioned. I was genuinely interested in seeing the source, nothing else, but thanks.
(Disclosure: I do corporate training (Python and Data Science) for a living.)
I generally don't teach coding to newbies, so a lot of the coding I teach is correcting poor mental models and teaching features (somewhat) unique (or different) in Python.
My best Pandas courses have been when the client opts to use their data for the course (instead of my canned data). The students are already subject matter experts with the data and when they learn some of the tricks to slice and dice, summarize, and visualize, they are off to the races. They dig right in.
Teaching as the article suggests is very difficult because examples that appeal to some or boring or confusing to others. I'm not saying it won't work, but there are cons as well. When I'm teaching with my "canned data", I try to mix in a few different datasets from different areas so students can see that the ideas are generally adaptable.
I always thought the best way to learn programming is to find a program you want to create, and then figure out how to make that happen.
This is still how i learn (most effectively) today. If i want to learn a new language or something, i write something that i always wanted to write in it anyways. That way it doesn't get boring.
I think what you're describing might be similar in that canned-data is not interesting.
This is true. You do have to watch for the "adult piano beginner" syndrome, though.
I'll explain: many piano teachers won't take adult beginners, purely because they have unrealistic ideas of how good they're going to be. They want to play a Chopin Etude or the Goldberg Variations or a Brahms Intermezzo, and don't want to spend time struggling with Clementi.
Well, sorry. You won't be that good for a long, long time, if ever. It could be that some beginning programmers also have wild ideas of doing a game as good as GTA, all by themselves.
I find the comparison really odd as someone in the opposite position - I had formal classical piano training from 8 years old until I gave it up during college, and later learned how to code entirely through copying other people's code and Stackoverflow in my mid 20s. Piano to me feels much more like a sport, in that there's a very visceral, physical aspect to playing, and in turn a ton of effort goes into optimizing everything from where your fingers should be placed to how hard or soft one is striking a key. Practicing is effectively comparable to training for some sort of non-team sport much more than anything else. I don't have perfect pitch, but learning how to read music is a very small part of the whole experience, and I would think that as an adult someone learning piano will find the physical aspect, particularly the finer motor elements, to be the primary hinderance to being really great. Writing code is entirely different in that it feels much more like learning a subject matter, and there's neither something akin to the apotheosis of the particular thing you're working on that you aim to emulate, nor hard boundaries as to determine your proficiency through performance. It's cool if your code doesn't work when you test it, you can fix that. It just feels like apples and oranges in the experience.
If you're picking up basketball at age 30, I hope you know that you're never going to be anywhere nearly as good as Curry, or Lebron. But you can definitely pick up a subject matter and become an expert later in life. Heinrich Schliemann essentially began his archeological career at age 36 and yes, basically excavated Troy in the worst way possible, but managed to actually excavate Troy. That's the difference between an adult piano learner and an adult code learner, I think.
> If you're picking up basketball at age 30, I hope you know that you're never going to be anywhere nearly as good as Curry, or Lebron
Well, I hope so, too. However, in basketball, the really good players aren't even going to let you play with them, so you're forced to play with people your own level. In music, you're constantly hearing 8-year-olds who are better than you will ever be.
I believe it's the motor skills, and the plasticity of the brain. Personally, I memorize pieces with no effort at all, but sight reading is a bitch for me and always will be.
In music there's also the stubborn belief that anyone who's older than 8 is too old to learn, and the idea that the goal of music lessons is to train professional musicians and anyone over 8 is not going to be ready at college age and has to pick a different job anyway.
No, I don't think there is. In my area (heavily Chinese), parents seem to believe, fervently, that children should learn an instrument. Especially girls.
Lots of parents think it's important for their kids to learn music, actually, with no thought that they'll become professionals. In fact, most of them would be horrified if that happened.
From my perspective that's some kind of weird Chinese thing. For a different view, you could for example look at the discussion at https://music.stackexchange.com/questions/120433/why-don-t-p.... It's a long thread, but search for "professional" and you'll find the same by multiple posters. There's also an interesting conflict of interest between students, their parents and music schools.
Just got around to looking at that Stack Exchange thread, and I'm reminded why I dislike that site so much:
It's full of PLPs (Pedantic Little People, or you can substitute a different P-word for "people"). And why is it full of PLPs? They get little brownie points for answering, and when you get to certain levels, then you're allowed to do even more! So they compete with each other and downvote your answer for, well, pedantic reasons.
I suppose this site has some of that, but it's not nearly as obnoxious.
Anyhow: I finally found a teacher who played standards, and actually studied with George Shearing! But they're few & far between.
Yes, music.stackexchange is pretty bad. Did you find any of the parts where someone writes that the classical teaching style is for training professional musicians or at least developed in the time when it was?
Regrettably, my visceral reaction to that site kept me from reading very far.
But yeah, conservatories are definitely that. "You, too, can get an expensive education and then struggle to compete with 200 other kids just like you for the the very few paying gigs in classical music!"
Have you tried formal computer science training? Learning programming through copying from StackOverflow sounds to me like about as good idea as learning piano by watching Synthesia videos on Youtube.
That's how I stop myself every time a desire to buy a guitar shows up. I'd like to play some solos from Ten Years After, Iron Maiden, or Dire Straits, but then I realize that this will take forever to learn, and my middle age issues wouldn't help with that either.
But you need some concept of what kinds of problems are solvable with a computer before you could really be inspired to program one.
And more than that, you need to have a concept of the difficulty of a given problem for a beginner or expert. Obviously a beginner will be wildly off, but probably needs some concept of the level of difficulty.
For example, lots of people have motivation to write a game. But few have the level of obsession to follow through with it. Maybe they should do a basic iPhone convenience app or something first instead.
> But few have the level of obsession to follow through with it.
If the goal is to release a complete product, then you're right that that's a problem. However, if the goal is learning, half a game is a great way to learn about a variety of systems and how to program for them!
It's a matter of scope and expectations. Leave your epic space opera in your dreams and take baby steps using easier tools and concepts. Once you find some fun try product-izing it.
I used to teach from the "program you want to create" angle, because that's how I learned programming. (JS/MEAN bootcamp)
The problem was that about 95% of my students didn't have a program they wanted to create. Some just wanted a hobby. Some wanted a better job. Some wanted to do a startup and manage a team, but they didn't really know what kind of startup to do. One guy joined because he made discord bots and thought node.js was cool, but learning loops started to get boring for him.
Yes, learning is much easier if you have motivation. How do you motivate kids, if they rather play games rather than coding (and they even ignore in-game scripted coding such ad Minecraft or Roblox coding)?
Heck, I'm employed to write code and I'd still rather play games. Just I get paid for the code, and not for playing the games.
But you will do better teaching-wise if you do find something that has intrinsic motivation, not turning it into a chore.
It just might not be the right time! They've basically got until they are 18-20ish to decide to get into it. The programming books my parents gave me after 8th grade never interested me. The 11th grade programming class didn't either. The junior year of college tangentially-related course where I was like "oh I could write a program to help with this homework!" That did the trick for me.
So just keep trying, see if you can find programming-related aspects of other hobbies. And just try to focus on them learning things around those hobbies or obsessions, even if it doesn't seem to have a practical application. Get in the habit of going deep on subjects and practicing learning.
Try a game like Factorio or Satisfactory. Even just Minecraft can be good enough to train their problem solving and critical thinking skills.
They don't need to start with redstone to learn to code. They should play the game and naturally realize that redstone is a way to solve their problem (like making an automatic sliding 2x2 door) and then solve it.
I feel like those skills will take you much further in life because now you have an extra tool to solve problem no matter what field you end up going into. And since programming is so powerful, it's often one of the best tools for the job so kids will naturally pick it up.
The trouble I had in Factorio is that it's deliberately not giving you very powerful tools in order to be a better game. The authors do not want you to skip their fun game by solving a tricky optimisation problem yourself instead.
My feeling, from ~eight years as a mostly-highschool math and science teacher plus parenting as my main work these last few years, is that this motivation to learn is best established very early on, hence my support for universal birth-to-three support (I’m in the USA) in the interest of minimizing adverse childhood experiences (ACEs/trauma) and teaching parents how to cultivate a growth mindset. Intrinsic motivation is powerful.
I was not a beneficiary of such care, and have done a lot of re-learning, especially around what I’m feeling, and being okay with not doing “perfect”.
One of the other places birth-to-three programs pay for themselves is to catch physical (e.g. hearing) problems early. That allow for correction and minimizes the affects in learning, reducing cost in later schooling.
> How do you motivate kids, if they rather play games rather than coding (and they even ignore in-game scripted coding such ad Minecraft or Roblox coding)?
Do such kids need to start with regular programming languages? Wouldn't visual languages be a simpler starting point for them to get motivated?
Having a good mental model of a language seems like one of the fastest ways to be more productive in that language. Do you have any recommended resources for developing a strong mental model of python? For reference, Dan Abramov’s course JustJavascript [1] provides an amazing mental model of JavaScript, and Josh Comeau’s css for js developers [2] course provides an amazing model for understanding css. I have 5+ years programming in python but admittedly do not know much about the internals so my mental model is pretty weak!
I was struggling to find why does
a = [1, 2, 3]
a = b
b = b + [1]
return a different value as compared to
b += [1]
Looking into the source code, everything became clear. The + operator returns a pointer to a new list np containing all the elements from a and b, while += merely appends and returns a pointer to the original list
> Having a good mental model of a language seems like one of the fastest ways to be more productive in that language.
True, but teaching s programming language is different than teaching programming.
Diving into a new language is something you do if you already understand how computers work and how to turn requirements into code. But to first acquire that understanding as a beginner, it's not enough to be introduced to the specifics of any particular language, which is what the article is talking about; you need to clarify what is the role of a programmer in understanding a problem and finding ways to model it as a group of data structures and functions that live in the computer.
Why thanks for asking yes I do: I recommend my book, Illustrated Guide to Python 3 [0].
Yes, I teach "professional" Python programmers who lack a lot of the fundamentals. It is so easy to get my with Stack Overflow style of programming these days. (Plus a lot of my students don't want to be "programmers" they use Python as tool to get some job done.)
Feel this mental model approach is part of the appeal of Scheme and SICP as you start with simple replace model but near the end (still exploring chapters 4,5) you get shown how to build an interpreter which forces you to know how it all works because otherwise it doesn't.
Feel that's sentiment get more now - it's *not* magic but the fact that everything works given it's all illusions is magical
There is a truly excellent series of lectures on YouTube from a college course on the Python interpreter internals. But I can't for the life of me find it. One resource I can recommend though is pythontutor.com. It's a tool that will step through your code snippet and show how the code maps onto the internal representation.
Any teaching, training, has to hook with the experience of students. Otherwise, it will lead to cramming, etc; that's what we see in grade-driven teaching.
You are doing a great service by using the client data to solve "mini-problems" of your students.
/watches straw man fall over without putting up a fight.
Would you rather work with someone who added a major subsystem to one of your compilers for fun or someone who had never coded but could recite the ISO standard by heart? Who believes the former person “would not be able to answer questions about [the subject]”?
If measurements tend to become targets over time then the goal of “develop expertise” measured by “pass a test” shifts to a goal of “pass the test”, and the test is limited to what you can ask hundreds of students in a couple of hours, and they’ve seen practise papers and last year’s papers and you can’t talk to them, and you can’t see them work or the results of their work.
Is that then a good way, to develop and validate their expertise? Is it the best available way?
> Who believes the former person “would not be able to answer questions about [the subject]”?
All the people who believe that "teaching the test" is not real knowledge.
For example, would you hire a lawyer who flunked the bar? How about consult a physician who couldn't pass his medical boards? How about get on an airplane with a pilot who flunked flight school, but "really knows how to fly"?
And yes, there are bad tests. But there are also good tests, and they work. Personally, I've never encountered a person who mastered a topic but couldn't get a good grade in it.
Lawyers who lose cases, physicians who couldn't save their patients, and pilots who have been in plane crashes still get to work in their occupation after the fact. Experience rules over all.
In your examples all those people never got to practice their craft. Lawyers can't practice law without a bar, physicians can't perform surgery without a medical license, etc. But software development isn't like that. What if there was a surgeon who has completed 10,000 successful surgeries but never went through med school? What if there was a lawyer who won major cases with no law degree? Or a commercial pilot who successfully flew for years on a fraudulent license and only stopped flying because he got caught? (That last one actually happened a few months ago).
If you could choose, would't you pick the surgeon with a wildly successful track record over the recently graduated med school student who has never done a surgery outside of residency?
Notice that I said “pilots who have been in plane crashes” and not “pilots who caused plane crashes.” This goes along with the theme of the lawyer losing the case, the surgeon losing the patient, etc. Sometimes you can do everything right and still everything goes wrong. Which is to say that the experience gained from these events makes these people better practitioners; it doesn’t matter what school they went to or what test they took if they gained real world experience practicing their craft.
No, I wouldn’t fly with a pilot who flunked out of flight school, but I would certainly fly with a pilot who’s flown for 10 years without a license over a pilot with a brand new PPL and <2000 hours flight experience.
Maybe for better perspective we can try this exercise: let’s say there’s a world renowned brain surgeon in, say, Norway who has worked for decades and performed tens of thousands of surgeries. No mistakes! Tens of thousands of happy stories!
But wait. Our intrepid surgeon can’t practice in the US because she didn’t go to medical school here! If she wanted to operate on a patient in the US mainland, she’d lose to a doctor who just exited residency!
If you were the patient who needed brain surgery, who would you pick? The world renowned expert or the guy who just finished training? Your logic dictates that the guy with the credentials wins out for no reason other than they went through whatever process to obtain those credentials, regardless if there are better metrics or methods to judge occupational success by.
> Our intrepid surgeon can’t practice in the US because she didn’t go to medical school here!
That's not my position. My position is if he was that good, he would pass the medical examinations.
> pilot
I'm not a pilot, but my dad was, other family members are, and I worked at Boeing designing the 757. Actually flying an airplane is rather simple. Most of pilot training is about handling an emergency.
These days, emergencies in the air are very rare. You may never have one in a career. But if you do have one, trying to learn how to deal with it on the job is a good way to die.
If someone really did fly 10,000 hours, but still cannot pass the certification test, he's a fool and you're a fool to fly with him.
Also, please do not confuse "did not take the test" with "flunked the test".
P.S. I have some training materials my dad had to learn. You're not going to learn that stuff by just flying around. Much of it is things that are learned about the airplane by expert test pilots, like how fast can you fly it without tearing the airplane apart. Do you think a pilot ought to know that speed before he gets in the cockpit? How about questions like how much runway do you need with a specific amount of airplane gross weight and altitude of the runway? I remember getting on a plane in Colorado and the pilot threw our luggage out, saying it was too much weight for the altitude, and it would arrive with the next flight. Do you want to fly with the pilot who couldn't make such computations? It doan' matter how good at flying he is if the airplane won't lift off the runway.
Take all 8 billion human shapes, four right angle corners and straight sides is the test, all sides the same length is expertise. You're saying that all squares are definitely rectangles, which I agree with. I'm saying all rectangles aren't necessarily squares. Then it feels like you're saying there aren't many more rectangles than squares, citing that there are unquestionably squares. Unstated I'm suggesting there are a lot more rectangles than squares, by Sturgeons Law 95% of tests are crud, so there are far more people who passed a test than there are people who passed a test and have expertise. There are so many people in IT with coworkers who passed MCSE or A+ tests but cannot do what the test said they can do that it has become a meme, for one example.
That 5% of tests are rigorous and accurately identify squares is not really something I question, but I might question that the people who pass them were "taught to take the test" and nothing else.
(Would you say 7 years of degree, medical school, hospital residency, rotation around departments, counts as "teaching to the test", i.e. "an unhealthy focus on excessive repetition of simple, isolated skills ("drill and kill") [which] limits the teacher's ability to foster a holistic understanding of the subject matter."? - from https://en.wikipedia.org/wiki/Teaching_to_the_test )
Again you're repeating the assertion "if you have expertise you can answer questions", "squares are rectangles", which isn't the point of contention.
It's the other way which is in question, "if you can answer questions, does that mean you definitely have expertise?". Is being able to answer questions the same as having expertise? Are there people who CAN answer questions but have no expertise? If so, how many?
Referencing your other pilot comment, is being able to say what action you should take in an emergency, the same thing as having the calmness and presence of mind and judgement to actually take that action in an emergency instead of locking up and forgetting and panicking? Certainly the pilot who does act well in an emergency could tell you about it, but can all the people who can tell you about it, do it?
You absolutely did say passing a test is proof of mastery, and you cited lawyers and doctors passing tests as evidence, and you said "there are bad tests, but there are good tests and they work", with emphasis.
I passed German at school, despite being unable to speak German. Anybody who spoke German could have tried to have a conversation with me and see that I couldn't, that would be a good way to judge my supposed skills. Any test which is not that, any test which is a proxy to that, or a way to judge that with less effort, is worse than doing that. Teaching me to answer the questions they were going to ask on German grammar, or recite the sentences they were going to expect me to recite, is even worse.
Of course people with absolutely no skill fail tests more than random, who would question that.
> For example, would you hire a lawyer who flunked the bar?
It's not about hiring a lawyer who flunked the bar. It's more like, how many lawyers are bad lawyers despite passing the bar.
I don't know about law specifically, but in my experience a lot of people who pass tests don't have deep understanding. Vice versa may also be true depending on the test.
I think you've got that backward. I think parent poster is complaining about teaching methods where the belief is that "answering questions" -> "mastery." "Grade-driven teaching" here refers more to the "all we're gonna do is give you homework and a test." It's like industrialization of teaching - no mentoring or individual conversation, just tests and reading material. When you've got 1 teacher and 20-40 kids, it's about all you can do.
Lots of passing of tests from short-term memorization that's then promptly forgotten.
What’s interesting to me is that I’m tue internet you’ve got loads of students and loads of more experienced medium people meeting on stackoverflow and forums and right there where there is individual connection and back and forth, the experts keep trying to silence it because they want only expert discussions about advanced topics.
Like the companies that will help you leave as a customer because at least you leave with a good feeling and might come back, versus the companies which make it hard so you hate them forever. Experts go round Internet forums with a “fuck off lazy noob” attitude then wonder why the forum is in decline and empty with only noobs traffic, and then blame it on the noobs, because they are overrunning the site and that must be driving the “good people” out.
Mentoring and individual communication happens all over, but it looks like “doing their homework for them” which is verboten.
If they don’t learn from your answers, you might, other readers might.
The fix for “eternal September” is not “duplicate question” it’s that the older questions and answers need to be deleted, forgotten. The important bit is the development of ideas in the questioner and answerer, not the production of paperwork.
I suspect there is room for a huge forum/site based around these ideas that would combine collaborative editing, live examples, questions, and push new people not on “how to ask a good question” but “how to engage in a back and forth discussion” in some way.
This has been a disjointed blog post in a comment.
I've forgotten the material from many courses I've taken. But I've also discovered that the knowledge quickly returns if I retake a course on the same material, far quicker than it took the first time. The knowledge is still there, it just needs some WD-40 to break it loose again.
And yes, doing column buckling problem sets in college enabled me to size the jackscrew for the 757, as it was a column buckling problem.
I don't know anything about column buckling, but if you'd cranked out a bunch of column buckling problem sets and not paid any attention to when/where it would be applicable, would it still have helped you later? If you had forgotten the exact technique, would you have been able to check a reference book anyway?
Do you think memorizing names and dates of people and events from World War I gives much mastery of history? Or would memorizing the names of standard library functions and the academic definition of `pointer` and `recursion` give you much mastery of C?
(The flip side of this is folks I've worked with who will immediately say "this is the Command Pattern" or such and jump to writing a bunch of code that either is massive overkill and/or just breaks down when the real world introduces some edge cases.)
I knew how the column buckling equations were derived, therefore I knew when they were applicable and when they weren't.
As for checking a reference, I knew that "column buckling" was a thing. Before I studied it, I didn't know the concept even existed, and would have no idea how to look up something I didn't even know existed or what it might be called.
> Do you think memorizing names and dates of people and events from World War I gives much mastery of history?
How are you going to understand WW1 without knowing who Ludendorff was? I know that if you don't know names and dates and events, you cannot have a mastery of history. You don't have any framework to hang analysis or understanding on.
> Or would memorizing the names of standard library functions
Nobody does that. But I will say that if you can't name any of them, I guarantee you don't know squat about C.
> and the academic definition of `pointer` and `recursion` give you much mastery of C?
I wonder how many C experts you know can't answer a question about what a pointer is.
Yep, a lot of mini-problems that are generally relevant. I also show "real-world" code for every concept. Then they can see how this is applied in the Standard Library or other popular Python libraries.
I have always struggled with how to advise my friends & family on this path of learning. It seems like everyone wants to be a WFH developer these days, but I don't know how to enable them to succeed on that path. "Go build something you want to build!" is something I keep reiterating (as does this article). But most don't seem to be interested in that for whatever reason (presumably because its fucking hard).
Maybe I should just leave it at that - I am getting to a point where if someone doesn't have the willpower to go burn a whole weekend on a pile of bullshit that won't even compile (i.e. because they really want to solve some problem), then maybe they won't have the necessary pain tolerance required to truly master the skillset.
I have never met a programmer I respected skill-wise that wouldn't randomly spend a weekend locked in a room solving an esoteric problem they felt they had to solve (for no reason). Over the Christmas holidays everyone at my company writes PoCs or hobby projects, being glad to have some free time away from paid programming in order to enjoy recreational programming.
What I'm trying to get at is software engineering is an easy career if you're literally obsessed with it, and most software engineers are, or at least were at some point (it goes in cycles).
If you're not gonna do that, you simply can't assimilate the huge amount of knowledge needed to truly excel in even one facet of programming.
When non-tech folks ask me how to learn programming because they want "jump on the money train", I ask them if they ever take the initiative to solve a problem with programming. You don't have to work in tech to do this. For example:
Work in an office writing documents and making spreadsheets? Have you ever simplified your job by writing a Word or Excel Macro?
Own a smart TV? Have you dug into its features until you know them backwards and forwards and can program it to (metaphorically) sing and dance on command?
Have you connected multiple things in your house together so you can control them from your phone, just because you could?
These are all examples of taking the initiative AND having the curiosity to dig into technical problems, and implement solutions. If you are like this, you will likely do well in tech and really enjoy it. If you DON'T have the tendency to do these sorts of things, you are probably going to have a bad time.
> learn programming because they want "jump on the money train"
I think this is the best predictor of poor outcome in the field. The devs I've seen that chose the field for the money typically didn't last long and did everything they could to get into a non-technical position (often management). And then, unsurprisingly, fared poorly there as well.
I often see STEM pitched as a way to make money... And really the only people making money out of it are the institution cashing the first-year tuitions checks before they drop out. And that’s not even touching the predatory ISA that bootcamps offer…
Jm2c but I'm a great developer (I think) but I'm a terrible tech consumer. I have issues with smartphones most of my peers do not and I hate doing smart things at home.
I would also suggest that it's a matter of having an engineeristis attitude (analyzing problems and finding solutions) more than the topic itself.
>or at least were at some point (it goes in cycles)
Indeed. And the periods in which I can be obsessed seem to be increasingly less common as I get older, but every now and then I get bitten and just have to bang it out.
You can be a great engineer and not need to do any recreational programming.
The thought that some devs are more respectable skill-wise because they hack in their free time is short sighted.
You literally have 8 hours a day to experiment and try all you want, everyday you have the opportunity to learn, hone your skills and experiment and good companies actually have days dedicated to experimenting.
Obviously you can't get great at this job if you don't bang your head on problems for days, but I fail to see that's a quality of recreational programming.
This “you gotta program all day every day or else you are unfit for it”-attitude is incredibly toxic and harmful. No other profession has this. No dentist gets told he gotta setup a practice in his garden shed to practice pulling teeth, or else hell be a horrible dentist. No, doing job for 40 hours a week is enough to be one.
I agree on this, but I believe the comment was aimed more at the "Tinker-Attitude" that many STEM-People have.
And I believe many other professions have this to an extend: I'd imagine that many journalists and authors enjoy reading in their spare time. Every mechanic I know has a cellar full of half-finished machines he fiddles with in the evening.
I don't have the energy to code on private projects for eight hours after eight hours of coding at work (besides occasionally enjoying not sitting in front of a monitor...).
But every once in a while it bites me to blow 10 hours of tinkering on some strange useless problem, like simulating Logic-Gates with basic arithmetic.
That was not prescriptive but descriptive. I don't program every day after work either, but I do sometimes get terribly addicted to a problem and work on it a great deal. I haven't met a good programmer that didn't have it, much like you don't mean someone who's properly good at anything they don't practice a great deal.
> No dentist gets told he gotta setup a practice in his garden shed to practice pulling teeth
This is a weird argument to me, the medical field has an even more unhealthy work/life balance than our field. They absolutely "practice at home" (obviously not through home surgery, but reading and so). Dentists have an easier time than most other medical professions, but every dentist I've met regardless had extremely good work ethic and frequently obsessed over his work.
You can absolutely work 40hrs a week and be a good engineer business-wise. However, most people who are remembered for their contributions to a field (and weren't just in the right place at the right time) dedicated a large part of their life to it. That includes writers, poets, musicians, doctors, anything.. to quote old Onion videos: are tests biased against students who just don't give a shit?
It is very common for professional athletes and for anyone who wants to live off their art (painters, musicians, writers, etc). Most academic types I know are like that too.
There are plenty of programming jobs where 40hs a week is enough and you get paid a good salary.
Now, if you want to join a FAANG, that's a different story. But no one wins a Grammy by playing exclusively in weddings either.
You can show people the door, but they have to walk through it. I learned programming, and a bunch of other stuff later in life (now 39). They all have the same process - you decide you want to do it, and you start doing it. You will absolutely fail hard and regularly at it. You'll pick the wrong course or book or language or whatever, but that's all part of the process. If people see you doing the work and are able, they'll help you out (ideally, not IME).
In a way its kind of nice to get started with something new, because you don't need a plan at first. You just start kind of doing it, and then when you take breaks, you figure out the plan. Its amazing how quickly you can pick things up once you get into the habit of doing it very regularly. That initial hump is always, ALWAYS a huge pain, but there's no escaping it. Failing and flailing for that initial period is how you learn, not how you fail.
I feel like I have a reasonably good track record of helping people get into tech (and was myself helped) and I'd note two things I've found very helpful:
1. It is very useful to let people know that the first ~500 hours of programming are the worst (not unusual for hard skills). I've seen now successful developers reduced to scream crying by the feelings lack of agency and overwhelming complexity during this period. Knowing it gets better can help them push through this phase.
2. Many people capable of being good developers respond badly to "Go build something you want to build!" because they don't actually want to build things, or the things they want to build are too outside their skill range and they feel disempowered. Giving someone a list of projects to do and textbooks to work through can be much more effective for certain people (like myself!).
Another way to handle 1.) is to let people modify the work of a master and build on their sholders to do fun stuff. I'd already "learned" a few languages (commodore basic, c, pre 98c++, and x86asm) well enough to do toy problems, but when my folks bought me quake I found it had a compiler and all the game logic in quakeC. I played the game a good bit but quickly it became about creating weird modifications, odd weapons shoggoths as pets etc. That exposed me to idiomatic code written by professionals, John Carmack presumably among them, while letting me skip everything between toy program or interrupt handler and using a game engine.
Code spells, a game on steam has some of that benefit, but nothing I jave seen since has been quite as accessible as quakeC
> But I had enjoyed working on the hard projects I'd encountered in my programing class back in high school. They were challenges I wanted to overcome. I changed my major and dove into college CS courses, which were full of hard problems -- but hard problems that I wanted to solve. I didn't mind being frustrated for an entire semester one year, working in assembly language and JCL, because I wanted to solve the puzzles.
> Maybe this is what people mean when they tell us to "find our passion", but that phrase seems pretty abstract to me. Maybe instead we should encourage people to find the hard problems they like to work on. Which problems do you want to keep working on, even when they turn out to be harder than you expected? Which kinds of frustration do you enjoy, or at least are willing to endure while you figure things out? Answers to these very practical questions might help you find a place where you can build an interesting and rewarding life.
> I realize that "Find your passion" makes for a more compelling motivational poster than "What hard problems do you enjoy working on?" (and even that's a lot better than "What kind of pain are you willing to endure?"), but it might give some people a more realistic way to approach finding their life's work.
---
A lot of people don't have the pain tolerance for the "this isn't fun" part of software development that is necessary to get past certain plateaus of skill.
It's like exercise. Everyone wants to be fit, but very few are willing to put out the sustained effort to get fit. There are no shortcuts, either. You can't pretend to be fit, you can't buy it.
Reddit has a bunch of posts where people will document their path to become a developer. Rarely do I see them go directly to building something they want to build.
It’s mostly people taking online courses and building the projects in those courses. They’ll do a few different courses and build up maybe 10-15 smaller projects before tackling something they want to build.
I've attempted to teach multiple family members/friends over the years "how to code", and they give up almost immediately. They "just don't get it", and I'd argue one needs to seriously find enjoyment in building things, and knowing how long things can take, to get started.
I'm not trying to level this against your friends and family, just an observation that I've been meaning to share, spurred by "just don't get it":
When I was in community college I had to take "Critical Thinking" as a pre-req for Symbolic Logic.
We spent the first 1/3 of the class, 8 weeks, analyzing truth statements, basically and, or and not. I was bored to tears, but attendance was mandatory, so I got to see how people absolutely struggled with this, and "just didn't get it". The average score on the mid-term covering that was a low D after 8 weeks of (excruciating for me) examples. I finished in <15 minutes and got 100%.
When you are in a bubble of people who work in engineering fields, especially in tech where logic is fundamental, I think it's easy to think that logic comes naturally to everybody, but it's far from ubiquitous and reading on here it sometimes feels like some people just don't realize this, especially those deep in tech.
Sometimes it's hard for engineers. In college, I majored in Computer Science, and for an elective, I took Electronics for non-EE majors. The first half of the course was analog electronics which I struggled with, but everyone else appeared to be following along fine. It was the second half of the class, with digital electronics, where things flipped. Students would struggle with "5V is a 1? 5V isn't 1V! What's going on?" while for me it was, "yeah, yeah, I know this already ... "
People want to learn the guitar|piano|violin, until they realize the amount of work it takes.
People want to get fit and jacked, until they realize the amount of work it takes.
People want to be a lawyer/doctor/engineer, until they realize the amount of work it takes.
Or they realize that they just don't really like it.
Programming isn't any different. One needs a particular mindset, and a level of patience to deal with debugging. It's not for everyone, and that's fine.
I know it's a pithy saying, but is it true? People tend to report the actual lifting of the weights as pretty pleasurable. It's the whole supporting lifestyle grind of consistently making it to the gym, only and always eating food whose ingredients you have weighed, etc. where you lose most people.
As part of the right routine and exercises, lifting weights can be very pleasant. Personally, I love doing a good set of dumbbell rows.
What keeps me (and I think a lot of people) from getting ripped is the sheer consistency needed. Doing anything that isn't strictly necessary for 1-2 hours 5-6 days per week every week for years is extremely difficult imo. I get knocked off course very easily, sometimes for months at a time, and I have yet to find a solution for this.
It's a pithy saying. It's basically shorthand for: "nobody wants to put in the work and adjust their lifestyle to achieve that goal of being ripped". But I wouldn't say doing 3x or 5x sets of lifting heavy weights ever is "fun"- you just get used to it.
Only caveat is, and this is where I feel bad, if the person hasn't learned something new in a very long time, they forget what it feels like to change, or even become convinced that they can't. It can be hard to convince someone that no, you don't need to have aptitude or be any good at it after a few days, weeks, even months. You just need to keep doing it. As long as the goal is realistic, you'll succeed. Whether you are more or less "talented" than someone else affects the timeline (a little) but you are going to the same place (again, realistic goals).
Applies to learning foreign languages too. I've spoken to many people that want to "learn Spanish" without having a clue that it's a huge grind to get to basic competency.
> I have always struggled with how to advise my friends & family on this path of learning. It seems like everyone wants to be a WFH developer these days, but I don't know how to enable them to succeed on that path.
The best advice is to get a proper CS or Engineering degree honnestly.
I have opinions™, but mostly agree with this article. Most intro coding classes and course materials read more like a glossary than a lesson. This contributes (rather directly) to the failure to retain a diverse student base in intro CS program. We've gotten a lot better at recruiting CS students from underrepresented groups (women and BIPOC chiefly), but numbers drop off quickly[1].
Studies in math education have shown that the way material is presented/courses are run has a huge impact on reducing disparities[2]. This is especially important in CS especially when boys are encouraged from a young age to do "techy" and "geeky" things in ways that girls usually aren't. Students arrive in intro CS courses, are sat next to students who have been coding since they were 10, and are rightfully intimidated even though they could succeed in the course.
While I was at the University of Michigan, I helped a professor develop "Joy of Coding," a mini-course for high school students that focuses on sparking desire ("joy") rather than teaching CS first principles[3]. By the end of the first lesson, students are manipulating images with code – a real "WOW!" moment. It's built on Pathbird, a platform that I built (in conjunction with UMich faculty) to run more engaging and accessible courses in computer science and computational subjects. (Shameless plug: if you're interested in Pathbird, or even just to chat, drop me a line at travis@pathbird.com).
> This is especially important in CS especially when boys are encouraged from a young age to do "techy" and "geeky" things in ways that girls usually aren't.
Just be aware that this is not everyones experience.
Many places boys are held back and girls are pushed forward.
And then afterwards boys gets told they are somehow "privileged" and would never be were they are if it wasn't for "male privilege".
Obviously this goes both ways, but there is at least some focus on it when it hurts girls.
If you try to mention the problems young innocent boys have, be prepared to get laughed out.
This is a pseudonymous account and I am not willing to change that.
I will try without giving anything away, but you will need to help me here:
- Do you really think some people here haven't grown up with feminist teachers who took it way too far?
- How many times have you heard anything about "Girls who code" vs "Boys who code"?
- If you are actually interested and ready to see something ugly, just go back and try to read some "mens day" discussion on Twitter or I think even on HN too.
I've tried to be active in those days in a positive way. Last year I gave up. Any mention of today being mens day on company chat is immediately laughed off with something along the lines of "and so is 363 other days".
Meanwhile men die younger, have higher incarceration rates, more suicides, and gets less education.
And also the few times there is discussion it is often redirected to "how men are suffering from toxic masculinity" which is probably true but only a small problem.
Meanwhile my sister's first programming course at university involved making a game using an existing bespoke framework. It mostly involved adding graphics and a few methods & some properties to objects (which already had physics etc. implemented) in an otherwise more or less done project base. I don't know about retaining or intimidation but I feel like it was way too much "just fill in the gaps, look you have a character on the screen now" and that they really failed to teach the basics of programming and I got the vibe that students finished the course not really having any clue how the whole thing works at all. The next course was object oriented programming at the deep end.
I feel like she's still struggling with the basics and doesn't have much self confidence at all. And she's not dumb.
1. Girls in STEM: society needs to quit telling people "math is hard, tee hee" and quit shopping in the Pink Aisle at the toy store and reinforcing that culture. Buy your kids Lego and Raspberry Pi circuit kits and see what happens.
2. CS is part coding, part science of algorithms, and part software engineering. We have to quit intertwingling all terms into the catchall "CS" bucket because sometimes "how to run excel" gets thrown in there too. Maybe best to drop the term altogether and use more descriptive names for each study.
> 1. Girls in STEM: society needs to quit telling people "math is hard, tee hee" and quit shopping in the Pink Aisle at the toy store and reinforcing that culture. Buy your kids Lego and Raspberry Pi circuit kits and see what happens.
Girls in STEM =/= Girls becoming professional programmers.
There are plenty of girls in STEM fields such as medicine, biology, geology, physics, Math, civil engineering...
The fact that not a lot of them want to be forced to sit before a computer 10 hours a day for the rest of their lives certainly isn't an issue if you asks me...
> Girls in STEM: society needs to quit telling people "math is hard, tee hee"
To me, the very existence of "Girls in STEM" groups is sending a weird message to girls (and I’m apparently not the only one to think that). Something along the lines of “sure you can do STEM, you’re just not good enough to do it the regular way so we created a group just for you”.
Honestly that’s the message a lot of diversity initiatives end up sending.
True to some degree, but I think it does help girls get involved in areas where boys are dominant. In high school the comments from boys towards girls interested in such pursuits can deter them. Having a space free of that, at least until they've developed the motivation to continue, is important.
As a high school CS teacher, I've seen how boys can be towards girls interested in coding.
All of this swings both ways, of course, and men are deterred from positions like elementary school teacher, nursing, and secretary roles. Gender being attached to jobs is just dumb in general, and keeps a lot of capable people from doing what they'd love.
> As a high school CS teacher, I've seen how boys can be towards girls interested in coding.
I'm surprised. I was expecting the opposite (boys wanting more girls in the classroom!).
> All of this swings both ways, of course, and men are deterred from positions like elementary school teacher, nursing, and secretary roles.
It's interesting that there's an acknowledgement that we need more male nurses (from healthcare professionals) and male elementary school teachers (from experts in the field) and yet there are zero initiatives to do so.
By that I mean money being spent toward that goal. The same way there's a will to have more "diversity" in medicine... mainly so that people of color can go serve "their people" in underserved areas (read: not very attractive or lucrative).
But in computing we’re spending a fortune and investing time to essentially… commoditize ourselves.
> I'm surprised. I was expecting the opposite (boys wanting more girls in the classroom!).
I think they probably want to be around girls, but most boys are social morons at that age. There is also the element of them being able to get in cheap shots to impress their friends. They don't really think of the consequences.
> It's interesting that there's an acknowledgement that we need more male nurses (from healthcare professionals) and male elementary school teachers (from experts in the field) and yet there are zero initiatives to do so.
Agreed, especially on the school front, as I think it's important for kids in schools to have a range of influences during their early years.
couldn't agree more - have STEM groups and encourage everyone that wants in, to join, but don't make them sit in the 'special class' separate from everyone else.
Sitting at a computer for 10 hours a day isn't a gendered thing.
There is nothing about computer science or programming that is gender specific. It, ideally, should sit around 50-50, ±5%. So yes, it is a problem that it so heavily skews male.
As to why, it's multi-faceted cultural issue, with how our society treats boys and girls starting from birth. In other words, a pipeline issue.
I never said or implied that programming was sexed, I told the parent that just because they are fewer female developers doesn't mean the sex imbalance is the same or even skewed heavily toward males in every STEM discipline.
RE: 2: I think I agree. There are lots of "CS" programs targeted towards high-school students which I have mixed feelings about. The goal shouldn't be to turn every student that walks through the door into a SWE (there's somewhat of a conflict of interest here considering most programs are sponsored by big tech companies who are desperate for talent – Microsoft does a lot in this space). Instead, I think it should serve a few roles: expose students to new opportunities (learn if you do want to be a SWE); give students the skills to understand that computers and algorithms are not magic (important from a public awareness perspective); and also to teach enough "deep" technical skills to prepare them for a world dominated by software (e.g., learning how to query databases, write small automations, etc.).
But I think most important is that intro courses need to serve as jumping off points (i.e., they should be INTRO courses). Give students a taste and let them decide if they like it and want to take another bite.
> We've gotten a lot better at recruiting CS students from underrepresented groups (women and BIPOC chiefly), but numbers drop off quickly
Are you really better at it if you can’t retain them in the long run?
The stats you shared are interesting, but to me it seems to highlight that students are getting “weeded out” at the beginning of the course. I would be curious to attempt a correlation with High school GPA and SAT scores. Because, if lower performing students leave, regardless of gender or race, that’s to be expected. But if overachieving students of color leave and their (white or asian) peers with lower grades don’t, now that’s an interesting issue.
> Students arrive in intro CS courses, are sat next to students who have been coding since they were 10, and are rightfully intimidated even though they could succeed in the course.
I would argue the solution here is to have different “levels” of intro courses. Because the converse is also true; students that are coming in with a decade of coding and who already had an introduction to programming might assume they will be able to “coast out” courses and then suddenly realize they are falling behind their peers. And then drop out.
Do you know of any comparative studies with other countries? Or is this a predominately US/Canada issue?
For example, do BIPOC students in Botswana drop out at similar rates? Do non-BIPOC students in Taiwan experience similar drop out rates? What are the classes and course materials like in these countries in comparison to the US/Canada?
What about drop out numbers from international students? For example, do Polish women studying CS at American universities drop out at the same rate as American women? For those who do drop out, do they drop out for the same reasons?
If we want to get to the root of the problem we need both more breadth and more depth in our understanding. Too often we stop at the men/women (in America) or BIPOC/non-BIPOC (in America) divides, and then provide generalized solutions which have very limit impact.
I can speak as someone who has taught CS in high school in a few different East Asian countries, including Taiwan. The bias exists, but is less pronounced than it was 10 or 15 years ago. Boys will make remarks, but if you nip it quickly at the start then it's generally ok.
I teach all four years in high school and each year I get more females rolling up. My recent graduating classes have had more females, but still only 20% or so, but my entry level classes now are 50/50.
Oddly, every female I've had who takes the higher level CS classes has graduated with the highest mark you can get on the exit exams. They routinely destroy the boys on any test and with regard to programming skills. Sadly, some of those who take it at the lower level are pushed by their parents to take other classes at higher levels in preparation for university admission. Parents sometimes carry that bias that females should not be engineers.
> This is especially important in CS especially when boys are encouraged from a young age to do "techy" and "geeky" things in ways that girls usually aren't.
It's not my experience.
When I was a kid CS/IT didn't exist where I lived.
I was a math geek who loved to occupy himself with solving problems which are useless in real life and I was actively discouraged from it by parents, teachers and even bullied by peers.
I still liked it but I tried not to speak about with anyone except some closest friends who accepted my weirdness.
From my perspective it seemed that compared to boys the girls need more acceptance are less likely to pursue something they like if they are actively discouraged from it.
Yes, I remember back in the day the girls would always try to come into the computer lab to play video games. My friends and I were always like, "GET OUT! WE HATE WOMEN!" Then they left. The girls wanted to learn how to code so badly, but we wouldn't let them. My friends and I were getting lots of sexual attention from women, but we thought that was boring, and preferred to spend our time alone on computers. The girls were having sex, but they thought it was boring, and wanted to learn to code instead, but my friends and I physically prevented them from entering the computer lab, using our strong muscles. My friends and I all had zero sex drive, and if we had any attention from the opposite sex we would have rejected it and continued to spend all our time on computers.
Interesting that you felt the need to sexualize the girls who were interested in computers.
They are people, not objects for your pleasure. If your comment even remotely reflects your attitude towards them, then you might as well have been telling them "GET OUT! WE HATE WOMEN!".
Do you think that maybe if you treated them like people and welcomed them to the group with patient explanations, expecting nothing, they might have hung around?
It's a parody of the ridiculous notion that geeky men try to keep women out of their hobbies. Reality is that geeky men are practically gagging for women to share their interests.
It's well documented that the behavior of geeky men discourages women who are interested in such hobbies and fields, so I'm not sure that it is entirely ridiculous for some people to assume that is intentional.
I at least try to never ascribe to malice that which can be easily explained by incompetence. Geeks are not known for their social skills. Their reclusiveness and cliquishness limits their ability to learn social skills from their more skilled peers, instead trying to learn from each other, like the blind leading the blind. Combine that with hormones and even more limited experience dealing with women as people and you get them either trying to one-up each other in some of the sort of dick measuring contests they use as social dominance displays or using patronizing gestures to treat women as if they were children.
I must share the very wonderful video by Seymour Papert on teaching LOGO. He makes a similar observation: imagine if we taught people dancing by sitting them at a desk and explaining all the steps to them, making them memorize them and write them down, but they were never allowed to actually move or try the steps. We find when teaching people a language for example that immersion works very well. So Papert suggests teaching math by immersing students in "Math land", and shows off his computer language LOGO designed to do that. It is a wonderful video in many ways and a big inspiration for me as I think about hopefully teaching in the future.
Missing from those analysis is the fact that not everyone has it in them to learn to code like that. I've genuinely tried learning to dance before with practice and I just sucked at it so I put it down and picked up another hobby. Yet in today's world we have this obsession with getting everyone to learn how to program in python. Instead we could be teaching the actual skills like critical thinking and problem solving in a ton of other ways that might stick better with students.
It’s a little confusing and sad to me that people have to try to pressure themselves to go from zero to professional engineer in a short period of time. That sounds stressful and, frankly, almost impossible.
Like a lot of people here, I taught myself how to code as a child in a terribly inefficient manner. I spent probably around 100 hours making games on my TI-83 - you had write a formula to figure out how to color each pixel, it was awfully slow. I spent hundreds of hours on Microsoft InfoPath making toy apps with a little scripting. Everything was very difficult, but it was insanely fun. I’m a night owl but I would wake up at 4am to start coding stuff so no one could tell me to go outside. At some point I read an introductory text that showed how to do web things, and later I got a server, and made some real-time multiplayer games by the end of high school. I didn’t know about databases so I would serialize to and from a text file. I’ve never had that much fun for such a sustained period of time since then. I couldn’t replicate it, and with the distractions of modern tech I probably couldn’t even focus that much anymore.
I’m grateful that my childhood obsession turned out to be absurdly lucrative. Best wishes to everyone, young and old, diving in for the first time!
>>>> I’m grateful that my childhood obsession turned out to be absurdly lucrative. Best wishes to everyone, young and old, diving in for the first time!
There does seem to be an irony, that the people who were movitated by interest in the subject matter aside from money, turned it into a lucrative career. Meanwhile the people who were motivated by a lucrative career lost interest quickly. Maybe not general enough to be a good generalization, but I've seen it a number of times.
I think market demand for certain skill sets does not contradict the principle of "find your passion," but just means that some peoples' passions lead to marketable skills.
Becoming a good scientist, or professional musician, takes about 15 years, starting in middle school or earlier.
> It’s a little confusing and sad to me that people have to try to pressure themselves to go from zero to professional engineer in a short period of time. That sounds stressful and, frankly, almost impossible.
... That's what engineering school is for. At least, that's how aerospace engineers, EE and so on do it.
> I’m grateful that my childhood obsession turned out to be absurdly lucrative.
I find that, when there's passion there's generally money. People that are insanely passionate will make things happen naturally.
Yes, undergrad is a good place to learn to code. I’m still glad I learned when I did, and I think it made college a lot easier, but no doubt four years is plenty of time, and allows ample opportunities to code for pleasure as well.
I was referring to the people who, say, try to switch careers to tech and go to a bootcamp to learn to code. That just sounds really hard to me, a horribly compressed timeline, and I feel like you would always be worried about gaining professional competency vs just relaxing and enjoying the ride.
I knew a guy who actually went back for an undergrad and masters in CS in his fifties. He was a classmate and briefly a coworker. He was an excellent student and won some department award, and very organized, but somehow not very good at coding things. He would get lost in a sea of sticky pads and notebooks and take two weeks to do very small amounts of work. He was let go in the end. We forget how hard this stuff can be. (Ironically to me it’s everything else that seems hard, from music to mechanics to sports, coding is just so… logical.)
> Why? Because none of these chapters answer the most important question a reader has, the entire time, WHY!? Why is all this important and what problems does it solve? When should I use this thing that I learned?
When I was an undergrad taking an advanced class about probability theory, I asked my professor for help understanding the bigger picture. I could solve each of the problem sets, but I couldn’t see the bigger the picture. Why the hell are we doing this? The professor told me something like “Oh don’t worry, somethings are just impossible to fully understand the first time. Once you take a second and third class that uses these ideas the bigger picture will come together”
I have found this mindset to be incredibly true. Rather than philosophizing about the optimal way to learn to code (or anything) just:
1. read/take a class about the subject
2. use the ideas you learned
3. goto 1
While it seems inefficient, I think it can be a very natural way to learn and avoid all catch-22 situations
Yes, I think there are two things which are simultaneously true:
- We (as a society) often teach in not necessarily the most effective way, or at least a way that might be a bit ineffective for a number of students.
- Some people get obsessed with "the best way to learn something" and never actually start doing the learning. I'm learning Japanese atm, and the amount of people you find online who obsess about the best method of learning instead of spending that time just working through a textbook (or whatever), is staggering.
It's good that you mention probability theory, because maths is really a field where I've felt that it's totally normal to feel like a complete idiot the first time you read something.
I observed in myself that when learning new programming language/framework/concept I usually need to force myself through first few chapters even though I may not necessarily understand why. This understanding usually happens later when multiple of basic concepts are in place, absorbed and together help to grasp bigger picture which leads to understanding smaller elements.
While this seems to be working decently I'm not sure if it's only because I became accustomed to this, allegedly wrong method of teaching - not only teaching 'how to code' as this method of teaching is default one in all kinds of school books.
I agree with this. Usually when I learn something for the first time I'm lost. But after I become a beginner in it, then go back from step 0, things get much easier to understand. This has been the best approach for me.
"<x> is broken" -- clickbait title. His approach is fine, I like it. Let him offer it to paying customers, and see how they like it.
There are many different approaches to teaching out in the world, some free and some not. There are code boot camps, which survive only if they work -- since they only last 12-20 weeks, bad feedback would sink them pretty fast (unlike 4-year colleges, where the worthlessness of your degree doesn't become apparent until years later).
I am surprised no one mentioned the now-classic How to Design Programs https://htdp.org/2021-11-15/Book/index.html, which was one of the first intro textbooks to actually take in account some education research.
Structure and Interpretation of Computer Programs follows this advice: designed for people who'd never used a computer before (no kidding -- this was common in the early 80s), the first lecture introduced the idea of procedures and abstraction and went on to demonstrate root finding, prime factorization, and a little symbol differentiation IIRC. A great way to get started.
I still don't any see initial introduction to the art of problem decomposition.
We want to do X ... what are the parts of X? How might we accomplish them? For each of them, what are their parts? How do we take a complex task and break into pieces that we know how to do and then compose them back together to meet the goal? What kinds of decomposition can we do? What kinds of decomposition work well?
Until you understand this high-level sense of what you're trying to, type list container map iterate immutable functional lambda coroutines are just noise.
Exactly this! To quote myself from a couple of years ago:
I wish the style of teaching complex programming topics walked me through the pain of making something work, exploring a few alternative solutions, showing the tradeoffs, and then after the pain has been experienced by the learner, a proper solution is finally introduced and recommended. IMO it's a much more powerful technique for teaching if you walk the learner through the pains first, then arrive at a solution, and tell them that "you've just [discovered how ownership works in rust]"; i.e. the concept is given a name at the _very end_, not defined at the beginning as a solution to a pain the learner never experienced. Unfortunately very few books/tutorials take this approach.
IMO coding should be taught like a trade. Take woodworking for example. Sure you spend some time learning to make straight cuts etc, but you quickly move to building thing with a lot of feedback.
When I was in school (it's been a while), we built super boring things that nobody cared about as our assignments. Various inventory systems, which you have to sort/search.
That was a big challenge of mine in school. I wasn't that interested in the assignments, because I was building boring stuff that didn't really solve problems, let alone ones I cared about.
I am pretty prolific in my career, and I'm not even what you would call a hardcore dev. Which brings me to my next gripe with CS curriculum: It is geared towards training hardcore devs and not any other type of engineer.
The types of coders we should have some sort of curriculum for, which we to this day mostly do not:
-SRE's
-Ops people
-Support people
-PM's
-Accountants/General finance
-DBA's
-SysAdmins
-Network engineers
-Cloud engineers
In the US, the kind of programming most immediately useful for sysadmins and DBAs, and other operations fields, are, or were, typically present in community colleges and technical colleges, not university programs (where CS dominates, or "programming for engineers/statistics" basic classes). At least that was the case 10+ years ago, have they stopped teaching those classes and providing certifications/associates degrees appropriate to those fields?
I partially agree, but how isn't the usual CS curriculum relevant for Sysadmins, DBAs, network engineers and the like?
What CS curriculum doesn't include networks, relational theory, hardware architecture, os architecture? How can anybody in those roles be successful without at least informally understanding the rudiments of big-O notation or without having some light scripting skills?
Certainly CS curricula could be improved, but a good one doesn't do too bad of a job at preparing you for technical roles IMO.
My inclusion of them on the list is from just 2 data points:
Those sorts of classes were available when I was in school, but it was not a whole track, it was 1 class each.
Second data point: These are the types of roles I meet in the wild who would benefit from coding, and they usually cannot (or can do some very light scripting).
I cannot explain it exactly. They just usually are missing that skill.
> Teaching how to code should be about problem-solving and effectively using the tools of a programming language to solve it. Say for example modeling a card game. Even better if the example is a continuous improvement starting from the very basics, hard coding stuff, and then increasing the scope as follows:
How funny! This is exactly the approach Jenny Greene and I took in Head First C# (O'Reilly), right down to the way we start with cards and suits, then ordering, building up to a complete card game.
You start with a static card on the screen and slowly add more robust features until you have a fully working card game.
I was able to follow this course in 2014 as a freshmen in high school and it certainly influenced my trajectory to being a professional mobile and web developer today. The greatest nugget I took away from this is that programming is not about actually knowing anything about the computer: it's about declaring "this is what I want" in a computer-friendly way and then following through with "how the hell do I get you to get out of my way?" aimed at the compiler. Although work experience has taught me that you also sometimes need to port this approach to managers and coworkers.
I also think this is why generic questions like "how do I learn programming?" put you in the wrong direction. You don't care about programming, you want to build an app, or a website, or a business, or a game. The first step is admitting what you actually want and then you accidentally end up learning programming along the way.
As a self-taught, highly agree almost all intro material I was coming upon back in 2013/14/15 was basically just a reference throwing concepts at you without a context that was incrementally increasing in complexity to guide you. I was one for trivia, so this was fine to a certain extent, but he's dead right, the job is not writing code (as much as the JIRA Industrial Complex would like to make it out to be), the job is thinking and problem-solving.
I only began to understand the thinking needed for doing my job after after mentoring by a consultant who fully grasped and could communicate this, where all the other in-house seniors were too stuck in the Complex for whatever reason to transmit this clearly (likely related to the near-unihibited freedom the consultant had relative to the in-house seniors).
When I was in junior high school in the 90s in my computer science class we learned Pascal by programming our own Light Cycles clone. Everything we learned was in service of making our game work. And we each came up with different solutions to accomplish the same things, and learned from each other.
This article seems to imply this isn't how things are done now, but surely they still are by most?
Similar for me. Even though I had already been programming on my own, my first school-led programming classes were with done with Logo, then Apple Basic, then Pascal, always used to build specific and simple programs. I never had an intro class start with types.
I have had success teaching complete beginners how to code using the following approach:
1. Show them how to implement a super simple text adventure game in Basic using just print, input, if, and goto.
2. Ask them what cool things they want to add. Show them the minimum coding skills needed to accomplish it. Only adding new skills when the students wanted to add more advanced features to the game.
3. Repeat.
I was blown away by the joy and happiness the students were displaying. They were programming and creating a fun game in the first lecture. Most of them stayed behind afterwards to expand their game, play the games created by the other students, and helping each other make more complicated features. What a joy to see.
Teaching everyone the same way is wrong. Everyone has different learning styles, education and life experience.
If there is a large enough market share for a topic grouping like learners together can be very efficient.
Creating a one sized fits most solution is the default setting for many educators and yields an "okay" result.
Allowing learning at your own pace, with community support and many styles of consumable content will give a excellent result for self motivated individuals.
Students who are not motivated or need help with motivation can be handled differently.
Edit:
Learning styles has a broad meaning more than just the "I'm a visual learner."
I thought "learning styles" were largely debunked as a myth now?
The linked article describes the structure of a reference book, identifies it as a structure suitable for a reference and those with significant experience, and then decries it as a tutorial for newbies. It seems rather obvious - I wouldn't try learning a new language by reading a dictionary either. It doesn't support the hyperbole in the title. There are many good tutorials for learning to code in different programming languages, sometimes it's hard to pick them out though.
What works for me, and pretty much everybody I've watched try to learn anything, is a simple loop. Conceptual explanations (whether written, verbal, or visual), applying the concepts with exercises / practice / work with examples to follow, digging into the details using a reference, and then broadening to the next set of concepts. Eventually the pattern recognition kicks in and people can see the connections and predict the rest.
> "Everyone has different learning styles" is a common misconception
The myth of different sensory orientations to learning is definitely, well, a myth; it is probably not justified to go beyond that and say everyone learns best with the same pacing and other details of approach.
I once got to be a fly on the wall (well, a member in the audience) to a graduate project presentation where a team had put together a simple game development environment to get young people excited about programming (Alice, which is still around: https://www.alice.org/). They were presenting their (relatively positive) results on how much engagement they'd seen getting students involved using Alice as opposed to available alternatives for learning beginner programming.
One of the professors in the School of Computer Science raised the question of why Java was chosen as the backing language for the whole project, since it's not a very strongly-typed language and for pedagogy, there are much better languages with more rigorous type safety.
The student presenting began to get a bit flustered when she answered (I believe her answer was something along the lines of familiarity of potential mentors and teachers with the language) and the professor seemed to reject her answer out of hand. Finally, her advisor stepped in and just dead-panned across the room "Because elementary-school students are excited about seeing cool things on screen, not about computing the Ackermann function." General murmurs of laughter all around.
I think those two professors had an ongoing debate behind the scenes that the unfortunate student had just gotten caught in the middle of.
An "Intro to Logic" (Pseudocode) class was required at my university before you could move on to any of the actual programming courses. It was a glorified linear programming course - think BASIC or BATCH with a bunch of jumps and goto's.
This is unironically a good idea. The main stumbling block isn't programming per se, it's breaking down a conceptual, informal idea of what you have to do in a formal language.
It matters very little whether it's linear programs, ASM instructions, LISP forms or C++ classes.
On the other hand, our University course started with half-baked explanation of what "public static void main" means (Java entry point) on the first day. It was horrible and no one understand anything until a few classes later we go to the meat of making/building stuff.
Yeah, I probably already commented on this some time ago, but I think Java is really, really bad as a teaching language. The language itself is just fine and much better than most people give it credit for, if you are a professional developer. As a teaching language is full of cerimony and it forces upon you an object model that you can't fully understand until much later. It's too much "in the weeds", if that makes sense.
Yea, AFAICT, Java has fallen off in schools in favor of Python, which is less opinionated about things like that. It has classes if you want them, lambdas if you want them.
I seek out projects that “push the boundaries,” but I do so carefully. I don’t try to implement a new air traffic control system.
This has the significant advantage, that almost everything I learn has an immediate practical application. I am constantly learning to ship.
It has the significant disadvantage, that it may not address some theoretical elements that could lead to practical advantages, down the road. That’s a real issue. I tend to reinforce established lore; not come up with creative new ways. Since my method favors practical application, it can be conservative. It can take some time time to “get around to” new tools, techniques, theories and discoveries. I am not “surfing the bleeding edge.”
It also means that I’m not so good at LeetCode, and I’m a lousy jargonaut. I do feel that my way reinforces a “ship mentality,” and that (I believe), is incredibly valuable.
Tutorials do exist for absolute beginners. Seems like the author is implying they rarely exist which is incorrect. "Hello world" is a tutorial/real world example. I learnt the how to code through the "Ruby on Rails Tutorial" by Michael Hartl.
The tutorial market is different than the computer science 101 crowd, so you have tutorials for one, textbooks for the other.
The issue with using tutorials in textbooks is that it's more effective to use 1 great example per chapter, than shoe-horn 1 monolitic project as an example for 13 chapters. And the three CS 101 books I've read do have good examples or interesting problems to solve. If I remember correctly the Harvard 101 book does use cards for objects.
One problem that the Ruby on Rails tutorial has as a CS 101 book is that there is so much boiler-plate stuff needed to have a functioning monolithic example. To do "hello world", need Database -> Code -> Template... when you can do: print("hello world"), then move on to next chapter.
I was going to make a comment very similar to yours- there's been plenty of programming 101 books, though maybe more so in previous decades starting in the '90s, which has the author present a project or a series of projects and each chapter involves building out the project while introducing concepts. While those books tend to be about teaching how to use a specific framework, SDK, or language rather than programming in general, that project-based method of pedagogy is common.
What's annoying about those books is that sometimes you don't care to go through the entire project, you just want to jump to a specific topic, but you're forced be part of a continuous narrative. Though in modern times where every technical book has a corresponding repository somewhere with code samples, you can at least use that code rather than starting chapter one.
Whether you want to learn from how-to projects, or from abstract first principles, there's resources out there for both. Teaching how to code is not broken at all. Maybe teaching data structures and algorithms could use more work- but that's the subject for a different article.
I think people are missing the main point here. It's not about problem solving.
From my experience people that are good programmers are people that like to tinker with things. The logical part of programming can be learned by any intelligent person reasonably fast. It's not about variables, statements, expressions, ifs, loops etc. It's about having a conversation with the machine and trying things out. The tools, languages, frameworks are just extensions of this.
Computers and the way they work are fundamentally alien to our human way of thinking about things. You need patience and dedication. One approach might work for person A, but not for person B. At the end with time just like everything else in life you forge a meaningful "relationship" where you understand each other and can work together with the machine.
One of the paradoxically oddest and best ways I've seen programming taught was from a games programming class I took in high school. We were tasked with transcripting a game (custom engine) from a booklet with its code already written. So it was more-or-less just typing what was in the book. Thing was, the code was filled with typos and broken code so that if you copied it verbatim, it wouldn't work.
I'm not sure if that was intentional, but as you'd go through the book and correct typos, you'd kind of just... pick up how to code. It almost became a reflex to understand and correct the code whenever you saw any errors. Most of us in the class came out of that with basic coding skills and we didn't need to go the path of normal exercises you'd see in most programming classes.
This sounds pretty similar to code koans, where you learn a language by making all the tests pass. The rustlings course for Rust works this way too - very effective IMO.
I don't really see how the proposed way of teaching how to code is any better... I do like the idea of use-case based teaching.
Have the student choose what kind of thing they're trying to accomplish, then structure the class dynamically based on the needs of their choices, or something like that
> Teaching how to code should be about problem-solving and effectively using the tools of a programming language to solve it.
This is one of the reasons I created https://codeamigo.dev. You can create step-by-step tutorials in multiple programming languages and view the output of your code directly in the browser. It's very similar to Codecademy, except anyone can _create_ a lesson. The idea is that we have a ton of knowledge in our community, but there is no great platform for sharing it with others.
If you're interested, give it a shot, it's completely free.
It's not about teaching people literally how to code. It's about teaching people how to learn how to code.
For example, if you're trying to teach someone Javascript with "this is a variable, this is a function, this is an event listener" they're going to get no where. It should be "how to change the color of a button when I click on it."
Then you guide the person to creating a good Google search query. And I think it's totally acceptable for beginners (and experienced programmers) to just copy and paste at the beginning, slowly figuring out how it all works as they try to get an idea working.
I'm a huge fan of Nature of Code and I agree that it's a wonderful book, but I don't think it's a book for people who are beginners (i.e. they're learning how to code). Daniel Shiffman has a ton of resources which are better suited for people who want to learn how to code - Learning Processing, the Coding Train channel, etc.
Motivation is the primary hurdle when teaching folks how to code. Having a goal to accomplish keeps them motivated, especially if there's feedback early - games, robots are good starting points.
> If you’ve read any of the introductory Processing textbooks or taken a class on programming with Processing (and hopefully you’ve done one of these things to help prepare you for this book)
Yeah, that doesn't sound like a beginner book at all.
> I've found that modeling or simulating something real like a card game is very effective.
I think the last paragraph of this article should have really been blown up to be the entire article. I want to know more about this experience the author had.
Because one question I have is: should we even be teaching object-oriented programming to beginners? The rationale for the modified class schedule is that it answers the question "WHY!?", but I still feel myself screaming that question after reading this piece.
Let me propose something entirely different: what if trying to get everyone to learn Python is too much to ask? In fact, why would we use such a niche programming language when there's one out there used by far more people: Excel. Why are we reaching toward the object-oriented model of program design, when the people have spoken as to what works for them? Far and away, the masses prefer the reactive, dataflow experience provided by Excel, so let's meet them at their level. And SQL to the list. There are people in my life who I wouldn't trust to turn change the battery on my laptop, and yet they somehow know and understand SQL for their job. They are completely mystified by Python, yet can write a SQL query like no one's business.
I think it's far past time "learning to code" meant "learning Python/JS/C". Let's stop trying to force them to use a tool that we developers are comfortable with, and teach them how to code using tools they already know how to use.
If you ask me easy teaching of programming died with the 8 bit machines that only did basic. You had instant feedback, the system was extremely simple and it was possible to hold it all in your head.
... and as you did more complex stuff you realized on your own that basic isn't quite enough and went to look on your own for more complex environments to manage the complexity you had created.
(Disclaimer: I work as an online Tutor for an Irish EduTech company which teaches children ages 8-18 to code via after-school and weekend classes.)
This article has the right idea. Our style of teaching varies on the kids age. Younger kids (8-11) are treated much like school children, the teacher presents a topic, kids are given activities to do which they screenshare, then we work through them as a class. This is done in Scratch, mostly.
As the kids get older we take a more hands-off approach, we have tonnes of exercises which take kids through Java via Processing. Learning variables by moving shapes, if statements by adding constraints to those moving shapes, collision detection by moving the mouse around and watching shapes change color as they collide, in the hopes to build their confidence to start building their own games.
This is a highly adaptable form of teaching, although it's only really possible and practical as we have such small class sizes, allowing tutors like me to be able to spend ample time with teach student when issues arise.
Younger students often have the enthusiasm, but they don't know where to guide it, this lends itself well to a lecture then activity format where there's at most a 7-8 minute period of "lecture" followed by an equal amount of activity time.
The older kids often don't need the "lecture" part at all, rather we set them more and more challenging exercises and explain things individually as issues crop up, it allows them to use their own problem solving and initiative and we have seen some excellent programmers come through because of this (some of whom have began working with us as Tutors after they turned 18!)
I've generally followed the article's outline for some programming tutorials I created.
The lessons are based on building a simple role-playing game. They try to quickly get to something to make the students feel, "I wrote a program!". I try to get them creating a screen, displaying a little data on it, and adding a button that makes a change they can see on the screen.
However, a big problem is that this approach avoids a lot of good architectural decisions. I don't want to spend the first twenty lessons describing abstract application architecture. So, as the lessons progress, and students ask for more-advanced features, I inevitably need to do a big series of refactoring lessons - which loses a good percentage of the students.
Another struggle has been with the language and tools changing over the years. I really wish people stopped using the lessons I wrote in 2014, with Windows Forms, .Net Framework 4.5, and Visual Studio 2013. Most of my support has been for version issues. Unfortunately, I don't have the time/energy to re-do all those lessons and videos.
Do both. You need the vocab - variables, types, methods, classes, etc. And then the application - deck of cards, real life inheritance, etc.
It's a highway, if you teach mainly the high level mental theory, they'll get it, and won't know how to implement it. They won't be able to associate the syntax to the logic of the theory. Inversely, if you teach only the syntax and implementation, they don't understand the theory and have a very difficult time applying that code in other ways. The problem of "take this loop that does this with the data and make it do something else.".
The solution to this is simple. Practice, and purpose. You just have to get the brain used to all the funny symbols and ways of doing stuff. The best way of doing that is for the learner to care and have a goal for doing it. Self taught programmers before uni will breeze through the intro classes, while new students struggle heavily. The self taught had a purpose to make things on their own.
This reminds me of when I took Java in college. One of the prerequisites was Introduction to Computer Programming 1 & 2 (101 and 102).
1 was along the lines of what was on the top of this article:
Chapter 1: Types
Chapter 2: Variables
Chapter 3: Operators/Math
Chapter 4: Control structures
Chapter 5: Arrays
Chapter 6: Functions
Chapter 7: Structs
Chapter 8: Classes and Objects
Chapter 9: Methods
Chapter 10: Inheritance and Polymorphism
And 2 was algorithms (sorts, etc)
Then the Java class was:
Chapter 1: Types
Chapter 2: Variables
Chapter 3: Operators/Math
Chapter 4: Control structures
Chapter 5: Arrays
Chapter 6: Functions
Chapter 7: Structs
Chapter 8: Classes and Objects
Chapter 9: Methods
Chapter 10: Inheritance and Polymorphism
But not much about what you can do in Java specifically.
I understand going over these concepts briefly and how to do them specifically in that class, but to have the whole class focus on them was not very useful. Again, 101 was a PREREQUISITE! So there shouldn't be anyone in the class who hasn't taken it!
IMO this was why the early web was so powerful as a way to on-ramp new developers. I learned coding a little bit before the web, from school materials like writing Pascal programs in DOS, in early 90s. Those were fun little exercises for school, but that was about it. In the late 90s I got the internet and got curious about making web pages, did View Source everywhere and taught myself HTML and basic CSS/JS (nothing more advanced than alert boxes and such at the time) while in high school, and it was what really got me to start my career in software engineering.
Building a web site gives you all the "why"s. It gave you a motivation to learn different aspects of coding. Whether it's the presentation layer in HTML, or application logic in PHP and Javascript. Conditions, loops, arrays and even data structures all make sense when you have all the context of the thing you're trying to build.
Yeah, I built a bunch of things in Macromedia Flash (Actionscript 4.0). It was when I realized that I can tie the animation with code. Hell, I didn't even know that it is code. It is just some structured text to automate thigns. Mind blown.
Interestingly related to the author's point of teaching using cards.
When I used to give coding interviews one of my favorite tasks was to implement the scoring rules of poker[1]. People would often ask "why ask them about poker?" and I'd show them that there is a ton of skill coverage
1. Decomposition of requirements into sub problems
2. pattern matching for code reuse and composition
3. seeing if they can come up with a decent algorithm to communicate to and from sub functions the results
4. seeing if they can come up with an ordering mechanism for cards
5. seeing if they can come up with a for loop that counts if there are 5 of something
6. String parsing to their own intermediate representation of cards
All these skills are used basically daily (at least in my workplace)
[1]: a good description of the rules, sample IOs, and myself as an oracle (ask me anything, no expectation of knowing poker itself) served to help keep "poker" from being the subject matter tested
If you truly believe that "poker" isn't the subject matter being tested, run the same interview question (this weekend) with a friend, blind, on scoring hands of cribbage. I'll wait. https://bicyclecards.com/how-to-play/cribbage/
A bit of a nuanced problem here. I've played a lot of crib too.
I hear your point, I guess my point is that serious measures are taken to dampen the difference between someone who knows poker and someone who doesnt. I've actually found largely candidates do not know the game so the calibrated comparisons is mostly between people who don't know the game.
Crib may actually be a better option -- the more esoteric the game, the less pre-knowledge plays a factor.
Edit: also NB: the only part that was to be implemented was the relative rank of a hand (ie, which hand won) . So the analogous equivalent in the crib example would be just the scoring of each hand.
I actually ran the interview on some coworkers for fun (they volunteered) and it was interesting to see the more senior (& IMO brighter) folks quickly recognize code reuse.
!@! SPOILER BELOW !@!
!@! SPOILER BELOW !@!
high card -> sort cards by value return cards[4]
Count cards (map[value]->int) --> Pair, pairs, triples, four of a kind
For each card is first token match? --> flush
sort cards , card[0] == card[4] + 4? --> straight
straight flush --> straight && flush
royal flush --> highcard == A && straight && flush
I agree there are so many issues with coding education, (full disclosure, that's why I'm building Qvault.io) but I don't think the big problems are the ones presented here.
I see the following as the biggest unsolved problems:
1. Online learning rarely teaches you what you should be learning. Resources are useless if you don't know which subject matter is right for you yet.
2. Platforms don't give you a feel for "completion", e
g. when and how should I start job searching.
3. You don't get personal mentorship or cohort support like you would at school
4. Too many videos, not enough code. Almost all learning when it comes to coding should include writing code.
5. Healthy mix of guided and unguided learning. Courses are great for abstract concepts, projects need to follow so that you can apply what you learn on your own
I love the last chapter of "No one teaches the end so lets put concurrency here" -- is so true. I feel like I've almost never done the last chapter of any textbook I studied in school. And it does seem like concurrency shows up in a lot of comp sci textbooks at the very end.
I’m an external examiner for CS students and around 90% of the subjects we test them in is stuff they’ll never use in the real world.
It’s obviously anecdotal but in several decades or real world work I’ve never heard the words composition and aggregation used, and I’ve frankly never seen them really implemented intentionally in code either.
I sort of feel the same way with things like linked lists, double linked lists, trees and so on, though I see the value in those, but not enough for them to take up half a year of learning along with various sorting algorithms.
I have no idea to balance the “useful to know” with too much theory though, but I do know that almost everyone who graduates is around a years worth of real world coding away from being a programmer.
I'm not sure I agree with this argument. Learning stuff by diving in and doing stuff immediately without studying the basics first may be fun and interesting, but it might lead to fundamental gaps and misunderstandings too.
I learned to write code from the bottom up. It was sometimes dull and hard work, but I think in the end I got very good at it.
On the other hand, I learned to play golf by just playing games. It was fun, I got ok quite fast... and then I never got any better. My nephew started playing by having proper lessons and could beat me after a few weeks.
There are people working on this rigorously, try going through Prof Krishnamurthi's papers: https://cs.brown.edu/~sk/ he teaches higher-order functions because they've found it helps students understand how an API works, he designed his own learning language from scratch (Pyret) and I went through much of his older CS19 Brown course here: https://learnaifromscratch.github.io/software.html because the course uses a web browser IDE, they were able to take stats of all students to see when they started to write code VS when they wrote examples and tests. The tests he teaches are property-based not typical cs101 style tests just plugging in edge cases and hoping for the best. His goal is to turn the teaching of programming from absolute guesswork and wishful thinking into something proven to work which is admirable, most CS professors that I had just taught whatever they felt was best for them when they first learned, not what is provably best for everyone in a large class.
Of course the answer to everything is 'just be motivated and dig deep into X then you will learn as you go' like building a program from scratch, or how some mathematician's learned by being fascinated with various topics and purely researching them on their own for hours on end. For some people this will work others will just give up when it gets too difficult, I find it's something you can do after 1/2 of a course, you have just enough education to be able to read the documentation and now you can actually teach yourself whereas before that just attempting cryptic docs about types and objects good luck.
Then of course there is getting paid to program, which requires specific skills you would never get doing ad-hoc hacking around for fun. You actually have to go on Kattis or Leetcode and bang out countless tiny algorithms where each one you have to defend your architect choices with analysis of it's complexity to a room of professionals with vastly more experience than you, and this is of course what most people want when they tell you 'teach me how to code' it's really 'teach me to make money from my laptop like you do'.
I like the idea presented here but I think a mix of approaches is needed.
After the author's chapter 2, "Chapter 2: Suits (String concatenation, Int vs literal string)" I would want to extend it to say on top of strings and ints we also have booleans, floats, null, and any other primitives and why they're useful (maybe these show up in the lessons, maybe they don't).
I'd do the same for chapter 3 too. After learning about arrays I'd want to include a section on other objects that are common, maps, sets, linked lists etc.
I feel like the average person already knows why. They know what they want and they just want the info on how to do it.
I don’t think the order of teaching presented in the article as bad actually is bad. What I think the problem I and others had is learning from a book to start with is really hard. Stuff doesn’t get retained well or make sense.
Programming finally clicked for me when I did the codeacademy class for JavaScript in 2012. What helped was it wasn’t just shoving walls or text at me. It was “here is a very tiny concept, go try it. Now here is another tiny concept, try this”
I created a series of small books that teaches code by making art. I give them a chunk of code to type and then I break it down after that. This is how I learned long ago.
People tend to learn slowly as they work, understanding more and more as they go. Often, they can make minor changes after their first project. Change the color? Make it larger?
I've been coding since I was six years old. (I'm in my forties). For the first bit of that it was BASIC on a TRS-80 Model 100 laptop, with 16k and a tape drive. Then, really, Perl and Hypercard. Answering the question of but what for??? was a huge part of my friends' and my dilemma in building simple games and projects. In my experience, there is a chasm between getting good at doing something technically and knowing what the hell you're supposed to do with that knowledge. Screensavers; that was the best idea we had and that's what we competed against each other on. We'd sit around and talk about how we could make something like SimCity plus SimEarth plus realistic physics and make a universe simulator. Or a driving game that could generate cities to drive through. But I had the same experience with 3D modeling! I could spend a hundred hours to make a dinosaur in a pirated copy of Infini-D. Okay, now what?
Perhaps this is off track, but I guess to us at the time the joy was in discovering the technical aspects, and tinkering and learning how to use them. I read the BASIC manual that came with the TRS, and I remember being 7 years old and skipping the part about "Arrays" repeatedly because it seemed too complicated to light up dots on the screen. Until one day I just was like, okay, what's this "array" thing, I feel like I'm missing something. And suddenly that chapter blew my mind. Likewise, I was deep into my third or fourth PHP online store / shopping cart in the late 90s, when a kid I hung out with was like, what? You're not using a database? And I was like no, I just have text files for each product. There's a whole back end for the business to edit the text files and images. Then, because I couldn't not look at it, I had to look at mysql. Holy shit, you mean I don't have to create text files for every product? Or block one person from editing them when someone else is? The rest being history.
Okay, broader scope: You can't generate use cases until you need them, and also, you can't learn tools until you have the use case for them, or else you're going to forget what they were for. Tools and the experience of working with the tools go together. You might be able to simulate that experience by building a card game, but like all skills, they will be lost quickly unless they're exercised regularly.
is one of the courses that really made me love programming. It has lots of exercises, good explaining and a nice interface. Its in Java but contra the opinions that "Java is a bad language to start programming" for me it wasnt hard at all considering I was young when I started it.
IMHO it should start with some tools, so that changing the code is not too cumbersome. How git works, how the IDE works, how some basic OS commands work. Everyone starts with a different base but often it's the people who messed around with a computer a lot who know some shortcuts that to most coders are obvious.
The less pain you have with changing the code, the more code you can try.
The problem started with using the word code as a verb. To code used to mean (1) translating a message into a coded form (e.g., cipher or Morse code), and (2) classifying something by attaching pre-defined codes to describe it (e.g., data entry). Programming a computer is not like either of those tasks, except to someone who doesn't understand programming.
> To code used to mean (1) translating a message into a coded form
This is probably where the verb form originates - translating the assembly or higher level ideas into the binary required for the computational engines of the past
Do they still use Java to teach object oriented to newbies? I remember being absolutely puzzled about all the boilerplate in my first coding class in high school. What do public, static, void, main, String[], and args all mean? The teacher telling us “Don’t worry about it, we’ll get to it later” always felt weird to me - why are we starting here?
I don't know of any of my peers that took a course that heavily relied on a textbook; it feels like most university intro CS courses spend most of the time commitment in lectures and problem sets. I think many would agree that you learn the most doing homework.
It's been common for a decade now to recommend beginners on the internet looking for an intro to CS the course Harvard CS50. The course has attracted criticism for be overwhelming for a single semester, as it requires submitting assignments in Scratch, C, Python, SQL, and HTML/JS. However, I think it, like other well-acclaimed intro to CS courses do teach problem solving in via hand-held labs and problem sets. Perhaps its prevalence suggests the course is influential in the way CS is taught, but outside of Yale copying the course, I'm not sure.
I think the problem sets in CS 50 are effective for teaching problem solving. Looking at examples of problem sets for the most recent semester (I did the Fall 2012, so it's changed a bit) there is...
- making an animation or game in Scratch which must have have a loop, condition, and variable
- printing pyramids of # characters
- caesar encryption
- ballot counting
- implementing bitmap image filters
- a spell checker
- writing SQL queries against a database of movies
- writing the frontend of a website
- writing a basic full-stack web app
I guess the main difference between the course and the post's proposal is that it doesn't follow a single narrative, so when you apply concepts in your head is only after the first introduction.
Looking on other resources I encountered at Georgia Tech, I remember both the intro to CS class I saw others take and the cool, interactive intro to CS textbook Mark Guzdial showed my class How to Think Like a Computer Scientist [1]. They both start with python turtle graphics towards the beginning to teach variables and loops before venturing off into other concepts. I think the first half of Automate the Boring stuff with Python actually faces the issues the author cites before diving into common applications in the second half; I do wonder now many working professionals learned from this text which I've generally liked at a glance. I suppose the most influential intro to CS materials are for AP CS A, although I'm not familiar with the course.
Pretty much our take at Scrimba. Except the most self-motivated students the content needs to take small steps, be relevant, be engaging and have low barriers to getting your hands on the code. So many students say they get an AHA moment with this approach.
I don't know about the card game approach, but the author definitely has a point. I'd even argue that this is a problem in most engineering teaching, talking about different little subjects with no picture of connection or purpose.
As someone learning right now this reflects perfectly my frustration with the teaching systems I’ve found.
The first part, let’s say the basic logic of programing is fine and relatively fast to learn. I have no problem with lessons starting there.
Where I find the problem is with the actual translation to real projects with the languaje, how to interface the code with the data, the server and the outside world.
The jump is huge! Of course you can overcome it with effort and stack overflow, but the feeling is like walking in a nice hill with clear views and path, and suddenly arriving to a vertical cliff with no clear routes up. You see others climbing easily, hanging out there, but you don’t even know where to set your first hand.
In my case, I’m starting with javascript in codecademy. The first lessons are more or less clear. Some concepts are harder to grasp or to express in code correctly, but with some exercises and effort you get them.
Then you start with real application stuff (promises, requests, Get, Post) , at first is easy enough, the concepts are not hard (the syntax is a bit harder, or at least the variety of syntax can be confussing). But suddenly you get thrown into AJAX, JSON, Frameworks, boilerplate. All at once, from 0. Copy this code, change this variable, lots of instructions but little learning or at leat a highlevel view of where you are.
I could choose another course, but I rather keep with the good parts in this one and look for the lacking lessons outside, than start hopping schools. Also I have some great friends that are experienced programers that can help me when I get too stuck.
Is interesting how different teachers explain differently. Some lessons are perfect for begginers, clear explanations, useful exercises. But in some lessons you can clearly feel how they are created by people used to teaching experienced programmers. Several concepts or tools thrown at you without further explanation, handwaving lots of steps, repeat this piece of code several times and that’s it.
I know that I can go through the material, google it, see youtube tutorials and classes and advance. I’m doing it, most of you have done it before. Not am impossible task by any means.
Maybe learning to code is easier than ever, but still… I find that it is way more complicated or with a steeper courve than necessary at the level I am currently.
There are lots of great resources to learn, but is difficult to find them structured in a coherent logical way for the learner! Is a bit frustrating TBH.
I think it's pretty normal and not even a problem to not understand everything your first go-around with some new tech.
I really wouldn't expect anybody to actually understand the modern web after one course. These things take time, experimentation, and deliberate practice before they will really sink in.
Moreover, you will always have to try to understand things at some level of abstraction if you want to be productive in any reasonable amount of time. To understand the entire stack of hardware, network, OS, browser, programming language, frameworks, and application code is at-least a decade-long journey.
This is true, and I expect that. Some concepts take time to understand and even longer to master. What I mostly find lacking is the lack of a high level map. What pieces do what, how they interact, then dive in. But the lack of context makes very difficult to keep plowing.
You don’t really know where you are going while typing boilerplate that barely makes sense, or jumping through 3 ways of writing a function (depending on the version , not on the actual necessity) when you have never used a function in the first place.
This makes harder to understand the concepts and make them stick.
I have a solution which has worked well for decades. Pick a textbook, read it from cover to cover, do the exercises. Don’t pick any textbook but a tried and true one like Structure and Interpretations of Computer Programs or How to Design Programs. I’m forgetting a lot of titles but you get the idea. Yes, these books will not teach you the coolest language on the block ATM, but you’ll be able to solve problems with any language.
It has worked well for me as IMO almost nothing beats a good textbook.
While it's nice to have a goal to shoot for when learning to program, it's also important to be able to practice discrete topics individually so that you can fully grasp what they're about.
The best programming language book ever written is the O’Reilly Rust book Programming Rust by Jim Blandy and Jason Orendorff. (It’s for people who are already programmers.)
personally i've always thought the best way to teach is with already working code. given a reference (the internet will do these days), some well written working code with examples of all constructs and idioms in it for a lesson, and possibly a sequence of prompts to change what it does with increasing difficulty, seems the best way.
most importantly, it must do something that the learner at least has some remote interest in and for best results the activity should be creative and constructive.
I've been thinking about this topic for a long time. I was a secondary math and science teacher for 25 years, and I taught intro programming classes whenever I could. Later I wrote Python Crash Course, which was largely informed by my experiences working with students - my direct classroom teaching, and my attempts to find resources for students who were capable of independent learning. I've looked critically at many learning resources over the years.
I certainly agree with the author's main point. Giving people a series of dry lectures or chapters that focus on syntax, without any intentional narrative about what it all means or why we should learn it is not particularly effective.
I'll make a brief comparison to the math materials I've reviewed for secondary education. There are many curriculum resources that are really well structured mathematically - all the math is correct, and each new topic builds on previous topics coherently, and leads somewhere specific in the end. But most of these kinds of resources are fairly dry to students who are not intrinsically motivated to learn math. Then there are many resources that present things in a fun or interesting way, but lack a coherent structure to the math that's presented. These are better at catching students' interest, but they still don't bring students to a place where they understand math well enough to use it effectively in their own lives. There are few curriculum resources that truly do a good job of hitting both of these goals - well structured mathematically, and with compelling topics. It's difficult because the people creating the resources need a really strong pedagogical background and a really strong mathematical background. People often tend to focus on one or the other of these areas.
I see the same issue in how learning resources are developed for programming. There are probably thousands of books that have a table of contents similar to what the author presents here, without a coherent narrative to motivate people through all those topics. Many of these books are technically sound, but they don't carry people through all the topics because there's too little tying all the topics together. Then there are a whole bunch of resources that use a specific compelling topic to grab people's attention; the author uses the example of card games. There are a couple limitations here: if you pick an interesting context, you only appeal to the people who like that subject. Also, you then have to stretch the context to cover concepts that aren't specifically needed for that context. That is, building a card game project brings up many topics and ties them together. But what do you do with important topics that weren't needed? Do you leave them out? Do you present them separately? Do you force them into the context?
One of my big frustrations with learning resources, especially k-12, is that they do a great job of grabbing kids' attention. We've kind of solved that problem - young people are plenty interested in learning to code. But to really gain the ability to build out your own ideas, you need to work through the list of topics that the author of this article presents.
What's the conclusion? There's no one way to teach people to code. We need a variety of resources that address all of these issues in ways that meet the needs of a variety of learners. People who are designing these resources, whether they're developing a book, video course, online tutorial, etc, need to think through these issues and have a clear and intentional approach to how their resource is structured.
I suspect that "teach coding by making Battlefield V: Definitive Edition" would likely require marginally more than the nine chapters proposed in the article for a basic card game.
I meant something like calculate your home budget, simple todo list, etc.. Something you might actually even end up using after you finish the chapters.
Article seems to be complaining about the typical chapter layout for a reference book on a given programming language. Such books aren't intended to teach coding. The intended audience is those who already understand how to code, in a different language.
Basically, every YT tutorial is exactly like the Chapters listed. Corey to Sentdex, or pick your favorite "How to code" book from Amazon. It is quite rare to find a book that the article describes (use-case based learning). Can you share a few if you know?
The Head First series of books. They are available for multiple programming languages and use the same set of use cases across them all. The books are even written with techniques to suggest to the brain it should remember this information.
Of course some mentoring is useful. But just the stuff that's pertinent to the task at hand; concrete help that gets them moving forward. Because, somebody is paying for results. And because producing results has a very positive effect on confidence.
I just offered work yesterday to a young person helping me at a big box store. I mentioned I was buying a device to test an Android build, and they got excited and started making cogent comments about the tool chain and devices available. I game them my card, and when they graduate in 3 months (from a local community college) I'll find them work on a client's contract.
The first project will cost me more than I earn from subcontracting them (because it takes me away from my high-rate work I would otherwise be billing). Maybe break even by the 2nd. But it's a sort of enlightenened-self-interest thing. If young people get into the field, everybody benefits.
And of course as an old guy with resources, I can afford to take some risks. Because it's everybody's job to look out for the other guy.