Blog post yesterday about coders getting frustrate...
# thinking-together
j
Blog post yesterday about coders getting frustrated with over-reliance on no code tools. https://jasonmorrissc.github.io/post/2022-02-24_no-code/. thoughts welcome.
👀 2
❤️ 2
y
As a programmer who has never touched no-low code solutions and was a few years ago of the mindset that programming is superior to low/no code in some sort of dogmatic way, your post was a really great explanation of why that thinking is flawed. Also, the second to last paragraph really puts this whole community into perspective. I wonder if there has been any effort in formalizing the concept of effort/complexity in this space. I know the TodoMVC folks are adjacent, but a more abstract solution would be really interesting
👍🏻 1
k
Imagine a programming language that doesn’t introduce the concept of a function until after you type almost the same code twice.
https://www.hedycode.com seems to be going something in this vein.
🚀 2
I really agree with most of the article -- except this bit:
Ultimately, they expect people to type code into a development environment. That has always seemed like a lack of vision, to me.
Imagine if you told someone having difficulty learning to write that others are lacking vision for expecting them to type letters into a keyboard. It feels confusing to tell them to wait for a technology that doesn't exist yet. I'd say it does them a disservice. I agree instead with your previous paragraph, that I quoted in my previous comment. We can only teach people what we know, though we can try to stage the concepts to be easier to learn. Anything else is research, something we have to learn ourselves before we can teach others. It feels a little dissonant that the two diametrically opposed views are so close together. Did you intend them as separate ideas, covering the space of possibilities?
👍 2
I really liked your exposition of the effort-complexity curve. One thing missing from this analysis is the qualitative change in the end result. Someone choosing whether to invest more in what they know vs what they don't shouldn't just be considering effort but also risk, the odds that the thing you end up with is broken in subtle ways that warp your sense-making. The classic example of this is the bugs found in the spreadsheet behind Reinhardt and Rogoff's influential paper: https://theconversation.com/the-reinhart-rogoff-error-or-how-not-to-excel-at-economics-13646 This is why Alan Kay harps on the right representation. The problem with pushing on excel for functions and tests and version control isn't just that they're harder, it's that it is harder to trust the results. Which is not to say the right representation has to be text or anything. But advances in representation are few and far between. The ones we know how to use are the ones we should build bridges to lead everyone to. Otherwise we risk building bridges to nowhere.
There's a common failure mode here shared by both conventional programmers and no-code: the gradual tendency to use tools beyond their acceptable ranges of tolerance. A programmer using a thousand-line shell script for a business-critical workflow exhibits the same failure mode. I'm not immune to it, and I'm not sure how to avoid it except constant vigilance 😕
e
Programming can be much, much better than it is. But only if the people who already understand it can genuinely focus on the interests of the people who don’t, without the hubris of assuming that their aspiration should be to become like us.
We can (and I would say, should) flip this question around: what would programming look like if we considered "using" a computer no different from "programming" it?
3
I would argue that systems of the past that took that approach produced wildly different computing paradigms than the mainstream "programming" of today
j
Kartik: Imagine teaching math to someone using a calculator, and telling them I'm just using the calculator as a teaching tool, so you can do it in your head, or on paper later. That's the lack of vision I am talking about. If you have managed to make something more accessible for teaching it to children, you have also, necessarily, just made it more accessible, full stop. Why assume that the accessibility is ultimately going to need to be abandoned? Why not strive to make the accessible version scale better? Use it to teach people to eventually type code, for the time being, while the options are limited. But also search for options.
k
I don't quite follow that. Perhaps we need a different example, because the question of whether kids should learn mental arithmetic kinda muddies this one. As another example, consider how we teach orbital mechanics to kids. Most of humanity never learns the fully detailed process that NASA uses to accurately compute a satellite's trajectory. Computing the precession of Mercury is still fairly specialized, from what I can gather. When people need to perform these operations "for real", they just learn how to do it. We don't ask why the procedure is complicated and hard to learn. Beyond the question of which side we each prefer, I'm still struggling with how you hold these two thoughts in your head at once: • Stage complexity so we don't overwhelm learners. • Why can't we just expand the simpler approach learners use so it always just works? Seems like lack of vision. (I suspect I'm just misunderstanding what you mean. Hopefully putting words in your mouth like I just did above will help catch the bug.)
j
I think orbital mechanics is a bad example, because almost no one needs or can benefit from having it as a skill. The same can't be said for code.
I don't think "staging complexity so we don't overwhelm learners" is quite what I'm saying. Because that could be accomplished by teaching them increasing sub-sets of the existing tools. That's good pedagogy, not good design. I'm saying "design programming languages with ease of learning as a design objective."
Right now, people who write Blockly are attempting to put a wrapper around a subset of JavaScript with the intention that the wrapper is eventually removed. But programming languages are wrappers all the way down. Everything gets compiled into something else. So the difference between "a tool to help people learn JavaScript" and "a visual programming language that is easy to learn" is vanishingly small.
k
I've tended to assume good pedagogy = good design, so this conversation is extremely relevant/interesting for me. A little more detail on my belief system:
Understanding a strange codebase is hard. I can't change that, but I think I can make it easier for people to persevere. I want to carve steps into the wall of the learning process. Most programs today yield insight only after days or weeks of unrewarded effort. I want an hour of reward for an hour (or three) of effort.
(http://akkartik.name/about) My previous project actually involved helping people understand how their code was translated all the way down to machine code: https://github.com/akkartik/mu. It wasn't visual, however. The goal is to introduce increasing subsets on demand -- and minimize the amount of backtracking. Later stages shouldn't require unlearning previous stages. The point of my orbital mechanics example was that we teach Physics to everyone today (aspirationally) but we still don't require everyone to know all of Physics. I've long advocated that everyone needs to learn to code (most recently https://archive.org/details/akkartik-2022-01-16-fosdem), but I haven't quite been so bold as to say everyone should know, say, how to write an OS. Instead, my definition of literacy is, "everyone can read novels even if only a few people write novels." So I think you can have everything you want while having diverse programming activities. As long as the process of learning to go from one kind to the other doesn't have abrupt transitions. Another possibility. In a world where everyone knows to program, I think we'll also see a change in the distributions of different kinds of programs being created. If everyone's hacking on federated versions of services we don't need all the queries-per-second, uptime guarantees, fault tolerance of centralized services today. CRDTs give us ways to minimize what people have to learn about race conditions. So the spectrum of programming may shrink, making it easier for people to span it from end to end.