Please Learn to Think about Abstractions
Jeff Atwood wrote a post called Please Don't Learn to Code and Zed Shaw wrote a post called Please Don't Become Anything, Especially Not A Programmer.
My wife lost her wedding ring down the drain. She freaked out and came running declaring that it was lost. Should we call a plumber?
I am not a plumber and I have no interest in being a plumber. While I advocate that folks try to be handy around the house, I choose to put a limit on how much I know about plumbing.
While my wife has an advanced degree in something I don't understand, she also, is not a plumber. As a user of plumbing she has an understandably narrow view of how it works. She turns on the water, a miracle happens, and water comes out of the tap. That water travels about 8 inches and then disappears into the drain never to be seen again. It's the mystery of plumbing as far as she is concerned.
I, on the other hand, have nearly double the understanding of plumbing, as my advanced knowledge extends to the curvey pipey thing under the sink. I think that's the technical term for it. After the curvey pipey thing the series of tubes goes into the wall, and that's where my knowledge ends.
Everything is a layer of abstraction over something else. I push a button on my Prius and the car starts. No need even for a key in the ignition. A hundred plus years of internal combustion abstracted away to a simple push button.
Please don't advocate learning to code just for the sake of learning how to code.
Never listen to people who try to make beginners feel like losers.
I think everyone should learn how to think and when to dig deeper and should be able to do it in a welcoming and friendly environment.
Learn how to question how things work. Learn that everything new and simple hides something large and complex. We are all standing on the shoulders of giants like Newton, Tesla, Kettering, Berners-Lee, and on and on.
You can choose to live in a world where things just work, or you can choose to dig a little. You don't need to learn to code, you don't need to be an expert in everything but know that you can learn. You can learn a little or a lot. I don't think the Mayor of New York needs to know how to code, but it'd be nice if he knew a little about DNS and a little about HTTP.
Judge Alsup in the Oracle v. Google case has been learning Java on the side during the case. Recently when a lawyer tried to imply something was a days work and patentable the Judge, armed with his new understanding that ends an a lower level of abstraction declared (via Groklaw):
Judge: We heard the testimony of Mr. Bloch. I couldn't have told you the first thing about Java before this problem. I have done, and still do, a significant amount of programming in other languages. I've written blocks of code like RangeCheck a hundred times before. I could do it, you could do it. The idea that someone would copy that when they could do it themselves just as fast, it was an accident. There's no way you could say that was speeding them along to the marketplace. You're one of the best lawyers in America, how could you even make that kind of argument?
Oracle: I want to come back to RangeCheck.
Judge: RangeCheck! All it does is make sure the numbers you're inputting are within a range, and gives them some sort of exceptional treatment.
The Judge could have remained in the dark, or relied on an expert to interpret for him, but he dug a step deeper and learned some Java. He knows how to think and he applied to remove a layer of abstraction away from the problem facing his court.
I opened the trap under the sink and retrieved the ring. She was thrilled. "I never knew that was under there." Now she does and now we both know a little about plumbing and abstractions. And that's a good thing.
Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.
I want to say thank you for this article. What you describe here is something a try to practice every day and advocate strongly for.
To my mind, it's not just that people forget they can learn, but I feel it's also a reflection on the disposable society we live in. There is not impetus for people to lean, and so they don't.
If more people tried things, or at least thought about it before deciding they couldn't, I can't help but feel that society would have a very different mentality.
Computational thinking means creating and making use of different levels of abstraction, to understand and solve problems more effectively.
I'm actively engaged in rolling out pre-AP computer science curriculum in Oregon designed to teach these very concepts.
Not sure if this can be applied to programming though.
The last time I was told to call the plumber, i did a little research and fixed my own problem...
The anecdote of the judge is interesting, since he didn't need to learn Java to understand what a range check is. But learning Java gave him the authority to call BS on the claim that this was a patentable idea. I guess you can think of an abstraction layer in a similar way. The layer says, "There's stuff here. You know stuff, and you know what it takes to learn new stuff. If you have bandwidth, need, or just want to validate what someone has said, lift off the layer and dig." Sort of like the cabinets covering the sink trap.
I think many people miss that most skillsets for working with technologies have a non-linear range of proficiency levels. Being able to read doesn't make one a writer, nor a novelist; but is a essential skill to each.
Anyone who has been using Excel should know a bit about relational tables (Databases). Primary and Foreign Keys. Because then they can build great Excel sheets that extract values from other sheets using lookup functions (Programming).
I see that Scott dug a little deeper into plumbing while writting this blog post! He has learned that the "curvey thing under the sink" is called a "trap". Way to set a good example Scott!
@Craig: You only know about the P-trap because you see it all the time. Code is hidden, so it's harder to learn naturally. People who do a lot of Excel work don't think nested if statements are complicated either. Heck, some people don't even realize what the "curvy thing" does, so couldn't use it.
@Bart V: Agree 100%. I always get the feeling that the "don't learn to code" crowd is a bunch of sequestered developers with some grudge against the business users. People in offices work with programming concepts all the time... sure, they are abstracted a little, but better understanding the underlying principals only helps.
@Jean: What exactly do you think the mayor is doing with his time? The entire basis of our educational system is that a broad range of knowlege is important in every field (remember all those sociology credits you had to take?) Would you have to same objections if the mayor started training for the NYC marathon? of course not. Snobbery!
What you article is really advocating is to have a T knowledge set. Know a little about a lot and a lot about a little. And then, most importantly, know what to learn when and how to learn it well.
"And we are now men and must accept in the highest mind the same transcendent destiny. And not pinched in a corner. Not cowards fleeing before a revolution, but redeemers and benefactors. Pious aspirants to be noble clay plastic under the Almighty's effort. Let us advance and advance against chaos and the darkness." - Ralph Waldo Emerson
As developers, we are expected to know (or be able to learn concepts in) any subject area that we work in. I know in-depth how A/B market testing works, how to setup a GL and basic accounting reports, the grant writing process, how to evaluate child care centers according to national standards... not to mention technical/math stuff like statistical analysis, etc (but that doesn't make my point as well)
It really annoying to see people in such a diverse field making the argument that "other people" should stick to their own area
(never mind that people are allowed to have hobbies. would we have this conversation if it was the "year of whittling"?)
Great blog... let me know if you need any construction advice ;)
Now, can you run for Congress and do the same thing for the Healthcare and Income Inequality debates?
This might be wrong if you are an OS programmer, but then I'd hazard a guess that they have to learn human interface theory, so I doubt it.
ptrap the technical term is ptrap LOL It is there to keep sewer gasses from overwhelming gentile noses when you lean too close to the sink. :)
But when problems arise someone better learn the magician tricks or it is doomed to happen again.
On the Zed Shaw line about beginners. Honestly in this profession no one knows everything(particularly me). But i find that a lot of people don't even try to learn and that makes it extremely frustrating to work with them.
My 3 cents
as an example, I was trying to fix a bug for a code that I didn't write. The code was doing complex task by calculating the shortest path in a network using a third party library.
And my first approach was to dig in to learn the library API, and what the code was doing.
And after two days wasting my time, I stepped back and try to isolate the code into layers, and voila, in 20 minutes I found the problem.
The great thing about the internet is I now have access to plenty of articles showing you how to do it basically right.
It still takes practice, and you need to know when it's time to rent the right tools and when it's time to give up and hire someone else.
I been programming for 20 years (not at your level or at the level of most of your readers) and I can safely say that I know a little about DNS and HTTP -- and only because it is relevant to my line of work. Maybe it's just me, but my family does not understand writing code and I don't have a problem with it.
I fix most of the pluming issues around my home and the only time I had to call a Plummer was to replace a toilet; and I'm sure glad I did. My father was life long auto mechanic but I don't fix my own car and he doesn't want to learn to code. It's all fine: he doesn't need to know how to code, and I don't need to know how to replace the pistons. Neither of us is worse off because of it.
Just my 2 cents
I've seen many programmers that if they would peel away just a couple layers of abstraction, they would be much better at their jobs and maybe even considered for advancement. But they are happy with mediocrity.
He's a very able computer user, but he professionally works 100% with his hands, cook/roofer/eavestrougher/HVAC etc...
I think that a person learn some coding/plumbing/electrical/etc... if:
a) It'll make them noticeably more efficient at their job
b) If it helps them know when they're being lied to (IE from a contractor)
c) If they're interested in it (not going to tell you not to learn something if you want to)
1. Replaced the front spring on my citroen.
2. .and the disks, pads brake pipes.
3. The relay that drives the fan that cools my huge fridge/freezer, has failed so I wired it seperately so its always on.
4. I built my own wet-room, yes! all of it, electrical, plumbing, new suite and tiling.
5. I stripped out all the old doors and frames in my hall and replaced them with new ones of differing sizes.
5. I took a few months out to get my PRINCE2 Project Management certification.
6. I'm raising six children.
7. I make a great Steak Diane and I remember my demi-johns of home made wine.
8. I'm brushing up on: Silverlight, MVC3, jQuery
I can't get a new contract, why coz I have a gap in my development contracting career (remember the PM thing?).
Put simply, I'm not clever, I'm just a jack-of-all-trades and master of none. I should really focus on just a few things shouldn't I?
- think Excel: lots of people do Excel programming and they are not programmers: accountant, engineering, technicians, etc, etc...perhaps even the Mayor...
- think VBA: dig a little deeper into Excel and you can have VBA logic.
- I even saw a refrigeration technician do an excel app that does all the calculations...
I remember years ago my dad plugging away at Excel to do his budget--he's a retired accountant and likes doing things the old way: he plugin the formula, do the conditions, etc. And he's not doing it because he likes coding.
Now, if you're talking about C/C++ that is different and recursion, pointers, etc--a lot of people don't grasp well--especially pointers and even among programmers. I won't go to C# and Java as these are relatively new and more accessible to new programmers.
Figuring out which level of abstraction to use is a skill programmers know to appreciate :-)
We heard the testimony of Mr. Bloch. I couldn't have told you the first thing about Java before this problem. I have done, and still do, a significant amount of programming in other languages. I've written blocks of code like RangeCheck a hundred times before. I could do it, you could do it. The idea that someone would copy that when they could do it themselves just as fast, it was an accident. There's no way you could say that was speeding them along to the marketplace. You're one of the best lawyers in America, how could you even make that kind of argument?
Would someone please make sure all software patent applications go through him from now on
PermaFlow makes a trap that you can easily retrieve dropped rings :)
I know I'll never be the world's best asynchronous back office web service developer and I wouldn't want to preferring to stick to WPF (which isn't as straight forward as I thought) and front end technologies consuming Web Services.
One advantage I have is to be able to brainstorm, design, build, implement and support code without the need for other stakeholders bridging 2 industries which helps prototyping ideas quickly which might have legs which I can test and iterate in the real world.
I think the important point is to know your limitations and working within an envelope you are comfortable with.
The curvy thing under the sink has a purpose other than catching rings.Understanding why it is there opens up a while new level of understanding of what is beyond your sink.
Learn everything that you can, great rewards come from learning about what excites you and or governs the world around you.
I don't know of any instances of failing in learning.. you may not learn what you expect to but you will always learn something.
I think Atwood is trying to draw a line that does not exist:
"Research voraciously, and understand how the things around us work at a basic level" .. but don't try to learn to program?!?!
Understanding is the creation of a visualisation within your mind of a process and the properties of the things involved. What is required for each individual to achieve this and what understanding they will develop can only be found out by trying to learn.
This comes from a creator of a site that tries to define a good or bad question.. *cough*autistic spectrum*cough*
Understanding the concept and actual deep understanding do not need to be confused with one another and when the right roles has the appropriate level of understanding then maybe we will see some people get called out for the fecal code they develop.
I wish that every manager I have would at least understand the abstraction that is coding... Just like I like that my spouse understands enough about plumbing to wiggle this and that when a flush fails, but to get me involved otherwise (I know WAYYY too much about plumbing...)
You summed up my view on this heated debate quite eloquently.
I think a lot of people reach a period where they stop asking "why?" Things just work and they tend to take that for granted.
At the end of the day: it isn't about what skills you do or don't have. It's about how curious you are, and how much you're willing to learn to satisfy that curiosity!
i would appreciate a feedback!
That is so true. I think the part about environment is a bit understressed, though. I don't know how bad it is usually, but I've been to the places where you just can't be treated as a person unless you know the stuff. And every time you try to ask a question or clarify some things for yourself everyone acts like he or she posses The Knowledge and your just some stupid idiot - mean things and condescending tone all over the place. This kind of environment is a motivation killer.
The plumbing would have been free, but the plane ticket to fly one of our handyman team over would have cost a grand :)
Glad you found the ring though!
It also occurs to me that that judge has a better better grasp of some of the basic abstraction in software than some of the geeks I work with. :)
Keep it up man.
'in programming what you know is not as important as what you can learn'
, you must be able to recognize what can be done with programming and from there you can learn how to do it. Just like plumbing, you know that water travels through pipes, if need be you can learn how to install them.
Let's take the analogy of piping onto the internet.
Where , or rather how, does our IP packets leave our house or DSL/cable modem, or however we connect to the internet(via cables at least). ?
I think most of us programmers have a rather rudimentary understanding on what happening between a user clicking an URL, and that request showing up somewhere in a stack trace of our webapp across the world. We know there's DSL modem, ethernet routers and we can even discover all the IP routers with traceroute.
I'm talking about the lower layers here. I'm familiar with ethernet, and wireshark, and can certainly see what's happening at my end.
But what's happening inbetween ? How does the packet look like exiting my DSL modem and going down to the telco central office ? I'm fairly sure ethernet frames are not the lowest level here as it is on my LAN.
How does the telco backhaul the internet connection from the central office onto the internet ? Certainly not by cat-5e cables. Likely fibre.Or Old T1's ? And what's at the protocol stack below my IP packets here ? ATM ? Raw STM-1 ? A micowave link ?
Please. Make a show where you follow your IP packet path out of your house, into the great void.
Robert A. Heinlein
Thank you for this post. I am going to send this to developers who just report an issue with 'Its not working' instead of 'It's not working and here's why'.
Comments are closed.