I was reading Jacob Kaplan-Moss’s blog article on “syntactic sugar” and I realized that there’s something sitting just below the surface of what he’s saying, something important, something counter to the standard “software development is an engineering discipline” view of our work.
Jacob rails against those who say the differences between modern computer languages amount to nothing more than “syntactic sugar.” Ultimately he argues that: Syntactic sugar matters.
Sure it makes no “technical” difference but it does make a huge difference — because it changes the way we think about writing software.
I’ll loop back to that in a second, but first a quick detour through another recent blog post:
Eventually you come to realize that in order to truly succeed, you have to write programs that can be understood by both the computer and your fellow programmers.
Of all the cruel tricks in software engineering, this has to be the cruelest…. Even when you’re writing code explicitly intended for the machine, you’re still writing. For other people. Fallible, flawed, distracted human beings just like you. And that’s the truly difficult part.
The thread that ties both of these together is that they highlight the way that people and by people I mean software developers, tend to forget is that code is always two things:
A series of instructions or declarations processed by a computer.
A series of instructions or declarations processed by one or more human beings.
Code is a machine construct, but it’s also a social construct. Software engineering is a strange name for our discipline, since the hard work of programming isn’t just getting code that machines can run, but in creating abstractions that allow human beings to learn, understand, and evolve the code over time. We didn’t invent Structured Programming, or Object Oriented Programming because they help the computer understand what we mean — we created them because they provide us with tools to help us as human beings to be able to understand the code we write.
Non-software Engineers aren’t concerned primarily with the practice of communicating complex thoughts and ideas to others. This is a vast oversimplification, but I think it’s fair to say that they are interested in constructing mathematical models of how things things behave, so that they can build stuff that works.
But that’s not what we are, we are creative writers, we invent new ways of thinking about the world, and we try to communicate them to each other every day.
Software Engineers do create incredibly complex systems, and operate under constraints that other writers do not — what we write has two audiences, one human, and one non-human. Writing for the non-human audience alone will result in code that’s incomprehensible to other programmers, but the opposite is also true. Computer programming is hard — and it’s hard for a very specific reason — because it requires thinking like other people, and not thinking like people at all.
Fortunately, the problem is simplified a bit by the fact that other programmers have learned at least somewhat to think like silicon and metal, so you can lean a little bit in that direction and still be understood. But still you have a very exacting, very alien audience, and a very exacting, very human one — and programming languages must be designed to balance the needs of both.
So, perhaps we ought to stop calling ourselves software developers, software architects, or software engineers, and start calling ourselves software writers.
You can’t shelter people from everything bad or scary, and expect them to live in the real world.
Project managers, System Administrators, and parents should take note of this.
People can only step up and take responsibility when they actually know what’s going on. Seems to me that there are lessons for how we talk to people about project risks, how we handle e-mail spam problems, and how we think about IT services. It’ll be a while before I figure out what exactly all of those lessons are….
We were discussing RuleDispatch and how it determines which set of predicates are “more specific” and I asked, “is isinstance() more specific than hasattr()?” at which point Aaron Bickell asked an very interesting related question:
Are bowling balls more tasty than love?
Thus pointing out the absurdity of my original question. But now I want to know! Are bowling balls more tasty than love?
Remote administration is the name of the game for the independant contractor. In a past life I did system administration for a living, and programming as a hobby. Now the situation is reversed, except System Administration is a boring hobby.
But at least with good tools, I can participate this odd hobby in the comfort of my own home.
SSH makes Remote administration of linux/Unix servers remarkably easy. Unfortunately Windows 2k/2k3 requires a GUI for Remote administration, but Microsoft generosity has alloted two Terminal Server Clients for remote administration purposes on every Windows 2000 and Windows 2003 Server they sell. Unfortunately, sometimes you get disconnected unintentionally. If this happens twice, you could get the dreaded “The terminal server has exceeded the maximum number of allowed connections” error.
Now, you can’t even connect to disconnect the old sessions. You’re screwed, and you need to drive an hour to the server and get to the machine and kill the inactive sessions.
Not really, you can just:
start | run - mstsc -v:10.10.10.10 /f -console
This attaches you to the special “console” session, which kicks whoever is logged in locally off and allows you to remote control the machine again. You can then kill the inactive sessions and move on with your life. Always kill the inactive sessions first, because if you get disconnected again you will have to drive in.
Since I normally run Linux at home, I don’t use the above command, I use:
I also have a shiny new MacBook which isn’t always booted into Ubuntu Linux, sometimes it actually runs Mac OS X. Have no fear I can use the Remote Desktop Client to connect to the console session:
No fancy command line option here, but you can hold down the command (open apple) key and click the Connect button.
If you control the server, and you don’t have any long running user processes you want to be able to reconnect to on the server I highly recommend also setting up your servers to automatically disconnect inactive sessions.
That way even if you get disconnected, you just have to wait a few min. until the first connection to drop times out.
I’ve heard that some folks are having trouble signing up for the TurboGears Tutorials at PyCon.
Hopefully, that’s all sorted out, and you can register at the PyCon site. If you’ve been on the fence about that, today would be a great day to sign up, since PyCon registration will cost $65 more if you wait until Tuesday.
I’m excited about all the interest shown so far, and I hope some more people sign up, because it looks like there’s going to be some extra cool stuff released in the next month, and I’ve gotten to see some of it and it looks fantastic. So, I would expect that there will be some interesting new stuff to cover in Tutorials, even for all you old hands out there ;)