I am very glad that in my bachelor program our microcontrollers class actually made us hand enter hex codes in a kit. It got tedious after a while (maybe it should have been for only a few weeks not the whole semester), but it gave me a weird sense of being one with the machine. And it has as awesome ice breaker when talking with older programmers. For some of them I am the only one of my age that they have met who has ever done this. Another thing is it helped me sort of see the flow of it and encouraged optimization.
(I don't want to give too much credit to my college, they did it not as some great pedagogical trick but to save money and laziness)
That is to say "no layers" or "right on the substrate".
Just a guess though.
Ok, I feel very pedantic saying this, but the substrate is the thing that is mostly semi conductors :P.
But don't take this so seriously, I work in semiconductor manufacturing and even I don't take it that seriously.
All possible abstraction removed = bare metal
On x86/x64, the chips have long migrated to an internal RISC like architecture, with an Assembly => micro-op translation step on the decoding unit.
Yes, assembly is an (mostly fairly thin, on non-microcoded hardware) abstraction over machine code.
Unfortunately we now have a culture that views this type of knowledge acquisition as "gatekeeping"
I'm in the opposite boat. I've learned so much about the theory of computing that I almost can't program anymore because most of what we do today feels like a waste of time to me. It's all convention and application now, with so many barriers to entry that I feel like 95% of what I do on any given day is setup. The dreams I had for how computing might evolve and lead us to the endgame of AGI feel more distant to me now than ever before. It will likely happen through the biggest players, using whatever proprietary tech they come up with, and leave garage hackers in the dust. I don't have a good feeling about whatever artificial agents arise from that.
So there is a lot of survivor bias in programming today. I feel like Obi-Wan Kenobi, beat down by the industry, marooned on some distant planet. Meanwhile the youth subscribe to empire quickly, because all they see is glorious rewards. Seeing haggard old graybeards like me fall from such early potential makes them rightfully skeptical of the gatekeeping you describe, the adherence to the old religion of computer science.
Or I'm just full of it. I don't even know anymore. I wish I was part of something bigger again.
I keep getting back in my thoughts to an old carpenter who was making a truly wonderful kitchen in a strange corner of an old building. Non of the walls, ceiling or floor around it were straight and it had tons of weird niches. I ask him how he could attack such a problem with such confidence. I would have to spend days pulling my hairs just making a drawing. He said, carpentry is roughly 300 methods of which you only need 120 to 140 to do any job. The rest is just tricks that you don't really need but they are impressive to those who know the problem.
I keep thinking of that in programing context for some reason. Nowadays you just order a plug and play kitchen that fits exactly, a novice can ikea it into place, everything works and it looks fantastic. Programming will get there one day. Until it does it will just look really weird to the old carpenter. So you grind the wood down to Particle board, you glue plastic on it that looks like wood then it gets moist and you replace the entire kitchen? .....!
A few years into my dev career, I adapted to make maintainable stuff. Because I learned that in 6 months I'd have to fix my own bugs.
Now it seems most code is throwaway, one-off, write only.
I haven't been able to "let it go". I still obsess over making my code correct. No one else seems to care. They get rewarded for fixing their own bugs ("velocity!") which I mostly avoid. So my KPIs look terrible by comparison.
I still can't figure out how programming computers (the most complex task a human can undertake) managed to become singled out as the only profession in the history of humanity that is simultaneously assumed by so many to be something you need only a cursory understanding of to be proficient at.
Now this is not to say on the frontiers of it its not very complicated. But so is every other field. Ever thought about plumbing a space station? Or designing a rapid deploy bridge? You can't compare frontiers of one field with the middle of the other.
both fields that have strict educational and credential requirements to practice professionally. Both strictly - dare I say it - gate-kept.
While the exam can be avoided if one isn't into signing contracts and taking legal responsibility in project execution, the order still has a last word to say regarding which universities are allowed to actually claim that they give engineering titles in Informatics.
You described yourself as "a guy who taught himself programming starting with calculators in middle school by the way (TI-Basic => C via SDCC => Assembler on calculators and MCUs". So you've had, I'm guessing, a few decades to learn and absorb all this stuff, and you started from the bottom/most concrete layer of abstraction and worked your way up - just as GP is suggesting everybody ought to do (and which I'm agreeing with). By mastering each layer before popping up to the next, each one was simple and made intuitive sense, so it seemed easy the whole time.
Now compare your experience to that of the hypothetical stockbroker who's diving into React native app programming without even really understanding what a loop is. He has decades to go before he understands what he's doing! What's NPM? What's a text editor? Is that different than a word processor? I screwed up my initial install... how can I start over? Insisting that programming is really easy and it's gatekeepers adding requirements that make it hard isn't doing him any favors; he's going to feel like a complete failure.
Rather, being honest with him and telling him that software abstraction is layered, and each layer depends on the ones below it, and while most people work at the top layer, each layer has idiosyncrasies that impact the layers above it that you need to understand when something goes wrong so you can easily troubleshoot problems, will probably ease his anxiety about diving into this (yes, very complicated) field.
And for the record, yes, I absolutely believe that programming as a profession would benefit from professional licensing like medicine, law and accounting do.
You don't need to understand those. The practical side is this: You can ask someone who does understand. The less practical reality is that the people who created the layer didn't have what it takes. (skill, time and/or money)
> programming as a profession would benefit from professional licensing
The existing solution is really quite simple. You have every layer up to the wall socket done by licensed professionals. Then you let those without formal certification go wild plugging things in, wiring extension cords, lamps etc. When comfortable with that they can even lay some pipe, pull some wires in it, add switches and wall sockets (As long as the components are certified!) All the way up to the fuse box (and no further!) They can even wire their whole house provided someone with certification signs off on it.
> Now compare your experience to that of the hypothetical stockbroker who's diving into React native app programming without even really understanding what a loop is. He has decades to go before he understands what he's doing! What's NPM? What's a text editor? Is that different than a word processor? I screwed up my initial install... how can I start over? Insisting that programming is really easy and it's gatekeepers adding requirements that make it hard isn't doing him any favors; he's going to feel like a complete failure.
> he's going to feel like a complete failure.
Why? You're casting this accusation on this hypothetical stock broker. Why are they going to feel like a complete failure?
How is this hypothetical stock broker any different than I was literally hitting random buttons in the programming menu of his father's calculator until he made some text appear?
> you started from the bottom/most concrete layer of abstraction
No, I didn't. I started from BASIC, I only learned C because assembler looked like greek and I heard you needed assembler if you wanted those fancy graphics all the best calculator games had and I learned that C let you write assembler somehow without writing assembler.
If I had quit because I didn't understand half of what I was doing (I didn't) I wouldn't be a programmer today.
I didn't feel like shit, I felt like a kid who had just found a candy shop, what great things were there for me to learn next?
Sure I had doubts, but they were easily drowned out by any modicum of progress I made, and soon enough I learned that it's ok because _no one_ knows all the fundamentals.
Out there there's someone who's scoffing at this talk of "knowing assembler lets you know how computers work", they're ready to bust out explanations of instruction pipelining, speculative execution (for now), how memory controllers work, what the micro controller in your HDD and SDD is doing to let your assembler do any kind of useful IO without understanding how underlying media works.
And also, if the stock broker quits because they don't understand what they're doing, in what universe is telling them:
"Actually go and learn this other stuff, that's the fundamentals. Just realize has a much much MUCH longer feedback loop, there's orders of magnitude more surface area before you get back to the level you were working on and can produce something that you recognize as being on the path of making the app you wanted"
Going to get them to _not quit even faster_.
In my experience the best way to get people feeling empowered is to let them make something that they can envision being on the path to what they want to make.
Writing a hello world in assembler and having it show up in a command prompt is not going to get my stockbroker friend nearly as happy as writing a hello world in React and running it on his phone, because he sees a glimmer of how the latter gets him to his goal of an app.
You're ascribing individual behavior to a broad set of people because they don't agree with your approach to learning being in their best interests. That's what I have such a problem with.
Who cares if they don't know what NPM is, who cares if every time he screws up he opens App Copy (23) and deletes the current one.
If they're going to quit because they don't know what NPM is or what a text editor vs word processor, how is sitting them down and trying to get them to understand assembler going to ease their anxiety?
And if you feel that's hyperbole, even getting them to understand NPM past copy and pasting commands. You'd be amazed at the things people have built that help real human beings do useful things every day while never truly understanding how NPM works.
There's nothing wrong with embracing people having no idea what they're doing just running at the wall until it starts to stick. It's what I did, and I couldn't have done it any other way.
You do need a fair amount of education, though - for every meaningful profession _except_ programming.
This can be traced to the 1970s.
Computer Science is only half of a field. Semi-arbitrarily splitting it off from EE harmed both fields. Instead of one complex field, there are two very shallow fields.
I still can't figure out how programming computers (the most complex task a human can undertake)
Neuroscience, making pizza (or most cooking, really), marketing, high-speed motorsport, psychology, most weapons development (outside of guns, which are fundamentally simple), writing mass-market books and drug development all seem to have programming beat in terms of complexity for what ninety-nine percent of professional programmers do.
Jobs worded it well in an interview at one point. Something along the lines of, "I knew there was a market for people who would never be able to design hardware or put a kit together but who still would love to write their own software," in the context of why the Apple II was successful. It works just as well to show why the field is the way it is.
Most computer programmers don't have a clue how the hardware works. That used to be an essential part of it. It's not any longer. The bar has gotten lower and lower, and that's not necessarily a bad thing. Python can be learned in an hour, so why not? They can still make useful things, so there's no problem with it.
Just like in any other field, the bar for "proficient" is low compared to average, but the bar for "exceptional" is high.
The bar has multiplied into multiple bars all at the their own levels but in different dimensions.
You can have an innate understanding from a single transistor to how individual frames are handled by an ethernet PHY to how the packet scheduler will interact with your userspace app and be an "exceptional" developer.
But the moment someone asks you to write an Android app that hits and endpoint and displays the data with some formatting none of that matters if you've never written an Android app.
Nothing is exceptional in a vacuum, and "programming" is so vast with so much space between disciplines it might as well be a vacuum.
Writing an Android application is not something that requires anyone to learn an entirely new skillset. At most, it's a programming language and a toolkit of difference for any experienced programmer.
How is learning a new programming language and new toolkit not learning a new skillset???
Even in a literal sense of the two words:
Skill: "a particular ability."
Tool: "a piece of software that carries out a particular function, typically creating or modifying another program."
How is learning "a piece of software that carries out a particular function" not "a particular ability."
In a non-literal sense, learning to write an Android App is a new skill if you didn't know how to do it before. Like you could happen to have Java experience so it's less new to you, but either you knew how to do it before, or you didn't and now you do... so you learned how to do it.
Are we literally at the point of gatekeeping what it means to learn how to do something??
Riding a Mongoose bike is not substantially different from riding a Schwinn bike. Riding a pink bike is not substantially different from riding a green bike. Writing Java is not substantially different from writing any ALGOL-derivative.
It's like saying writing a program for FreeBSD requires a different skillset than doing so for NetBSD. It doesn't.
Not everything is gatekeeping, and it's disingenuous to claim so.
But riding a unicycle is somewhat different than riding a bicycle, even though they look a bit similar and even have some of the same features. You’re drastically underestimating the amount of time it takes to write a new language proficiently: perhaps you’re confusing the ability to read a language from writing it?
You literally reduced language design to changing colors on a bicycle.
Are you joking?
You have no idea what Android is if you think it’s development process vs Java (which Java? Embedded Java, desktop with JavaFX? Server side?) is like FreeBSD vs NetBSD.
Maybe more like FreeBSD vs Windows and you’re trying to write a UI application, but technically you can use C on both platforms so it’s the same right?
Thanks for the chuckle in these dreary times...
By the way do you actually think syntactic differences are all that separate languages so once you know the general syntax you pretty much know the language, or are you pretending to not know how programming in multiple languages actually works to prove a point?
A: I've written a couple.
B: Anyone who knows any ALGOL (exception: 68), Pascal, Oberon, so forth, will get Java in minutes.
You're demonstrating reasoning flaws, alongside misinterpreting my words. Writing an application for, say, NeXT, back in the day, isn't different at all from writing a modern Mac application. What you do carries over. It's the same basic steps every time. Write a desktop Linux application, write a desktop Windows application, write a Mac application, write an iOS application, write an Android application. You'll have to use a few different wrappers or libraries, but it's not a new skillset.
You claimed that learning a new language is giving yourself a new skillset. It's not with the majority of languages, especially languages like Java, which introduce little compared to their immediate predecessors outside of syntax changes.
This is a frankly ridiculous comment. ALGOL-derivatives grab more from ALGOL than syntax, and some don't borrow syntax at all. Any Pascal programmer can go from writing Pascal to Oberon to Java to ALGOL to Go with ten minutes per language, in any order, despite the differences in syntax. The languages are not differentiated strongly enough to matter; that C programmers could go to writing Java in the span of a day was a major selling point that Sun used, and C and Java are more different (though again, not that different) than any of the previously-listed languages.
Any J programmer can go from J to APL to K to Nial trivially as well, despite vast differences in syntax. Knowing one or the other doesn't mean you have a differing skillset.
The same is true for most Lisps (Connection Machine Lisp being an exception, as a counter-example; despite that, knowing any of these isn't a new skillset).
Just because something requires you doing something slightly and superficially different than what you were already doing doesn't mean it's magically a new skillset. Defining finding new libraries as "new skillsets" is just silly, and erodes the meaning of the term.
I don’t know if you actually believe this, or you’re defining write as in literally type letters that compile instead of being able to write useful productive code in each.
The rest of your comment is more wtfs kind of like that one.
This is not a productive use of my time because either you have no idea what you’re talking about, or you do but you’re intentionally throwing basic reasoning skills straight out the window and leaning heavily into playing games with semantics to support your point at all costs.
Now I’ll be charitable and assume the latter, but if that’s your goal, then what more is there to say?
Yes, Android vs Java is a pink bicycle vs a green one. Pat yourself on the back for that revelation.
imul rY, rX, 7
add rY, 5
mov rX, [...]
mov [...], rY
Bootcamps demonstrate that not knowing assembly is not a barrier to earning a decent software engineer salary.
EDIT: It was 8085 kit, not 8086.