69 karma · joined September 14, 2009
There seems to be a large demand for software, and the system is good at producing a lot of software.
magic()
What's that? It's a function call. What does it do? Anything. Everything. Why does it need a complex grammar? It doesn't. Spend your time thinking about the problem, not the language. What a concept!
Do simple things take many lines of code in C? Yes. If you only have a few data structures and algorithms in your mental toolbox, simple things will take many lines of code in C, or C++, or in any language. Why do people advocate baroque languages by claiming that you cannot do simple things simply except with baroque languages, and then blame people for complicating their programs by using that baroqueness?
Yeah, C++ programmers are feature junkies; the language is designed by a feature junkie and promotes language features as the solution to every problem. If you go against that, you are going against the whole culture.
If PL/I was the fatal disease, C++ is the shambling corpse.
As long as it also had C syntax, and something close to the C memory model, and was recognizably object oriented and/or functional. And came with a lot of libraries. And 3D graphics engines. And physics engines.
Unless some independent game developer does something in a new language that other developers can't easily duplicate with their current ecosystem (not that it couldn't be done in C++), and it catches on, there's no incentive to do anything other than continue to evolve things in the most backwards compatible way. There are always more C++ programmers coming off the assembly lines who want nothing more than to work on games.
I think ahoyhere has alluded to the reason why the pile of features tends to win, and that is because it is better at leveraging the economies of scale in the shrinkwrap software business. It is so cheap to distribute software that you are much better off building for the mass audience. Now the hot thing is webapps which do not scale nearly as well (but avoid most of the junk that comes with shrinkwrap scaling, like having to deal with a strange machine and a crappy OS that deluges the end user in spyware, or pushing updates to users you don't know much about), so there is more incentive to meet the needs of a niche audience. And Apple is having some success sort of splitting the difference (vertical integration from the hardware up, and attempting to exert more discipline on developers to increase quality, all at the expense of distributing software to mass audiences). Microsoft, of course, is still in a pretty dominant position from exploiting this scaling to the max when IBM so graciously made the hardware into a commodity mass market item.
So far, the most successful web app (Google) is the one which has made web app discovery scale like nothing else (every page with useful content on it is a web app - code, data, it's all the same). The brilliance of Google is that it captured a mass end user market with a minimal user interface. They did it with math (maximal leverage of plain text queries plus the structure of the web, and similarly with ads which have simple interfaces at both ends and are backed with sophisticated algorithms), and scaling by imposing unusual amounts of internal discipline on the best developers they can get (and they can get pretty good ones). All this just to get to a position where they might be able to compete with Microsoft as a platform, and unseat the power of shrinkwrap scaling. I think the only way they can do it is by attracting a lot more developers than Microsoft, and the only way they can do that is by taking a lot of Microsoft's developers away. They might be able to do it, but there are all sorts of challenges. My guess is that what will happen is that they will draw a lot of developers away from Microsoft, and in the process they will lose a lot of their external cultural influence as far as being able to promote clean interfaces. Web apps will be even more dominated by the everything in one place aggregators (exemplified by Amazon and eBay) than they are now.
The problem with nice UIs is that there just aren't enough good developers to make it scale.
If you do read the book, you will see that the discussion begins with Norvig saying that he thinks one of the most important things is being able to keep everything in your head at once. Extra tools come in when the problem gets too big to do that, but here's the key: he saw right from the very beginning that the Sudoku problem could be solved with two tools from the AI toolbox. In other words, he saw the entire solution immediately, and it was never too large to fit easily in his head.
Seibel's analysis fine as far as it goes, but he misses the really important thing here, which is that this is not just an example of someone recognizing a problem that they already knew how to solve. It's a case of someone with the mental tools that allow them to dramatically reduce the (apparent) complexity and size of a very large class of problems that happens to include Sudoku. Seibel takes a bottom up look at the data structures Norvig used, but this can be misleading because they weren't designed bottom up, they were designed all at once. You simply cannot do that unless you have the necessary training in abstract thinking (read: mathematics/formal logic/language development/ai techniques/etc).
No amount of code centric techniques or tools will ever make up for not having these tools. There will always be (relatively trivial) problems that you will never be able solve without them, because you will not be able to fit everything in your head and your ability to reason about the problem will be crippled by that. Debates about TDD are not even wrong, because they are at the wrong level of abstraction. Spending any significant amount of time discussing it is premature optimization.
Few things depreciate in value faster than source code. Forgetting revisions is useless if the memory is just going to be filled with more code. The prospect of petabytes of bloated, broken, and rotting code in any sort of repository is frankly disgusting to me. We are drowning under the weight of programmers who think the product of their typing (not so much thinking) is so special that it needs to be preserved forever more. I pity the new yosefks, the debuggers of tomorrow, I really do.
Listening to people like Gwynne Dyer talk about global warming makes it sound like the problem is not so much that we don't have enough people tracking the environment, or even that we don't propagate the information fast enough, but that the sheer inertia of the system makes it so that changes can't be made fast enough to avoid major shakeups.
Or at least that's my half-assed theory. Guess I should probably read up on Robert Axelrod's stuff now. Thanks for the pointer.
Genuinely curious here, as I don't know, or know much about, any of the people involved.
There's a reason why all the best languages (lisp/forth/etc) are language building languages, not library building languages. A library building language is just a DSL that you can't modify. You can write anything in it, but so what? You can write anything in Brainfuck too - that's what the term "Turing tarpit" was coined to describe.
When someone tells you what their favorite language is, you should ask what that person does. If all they do is write web apps, they probably like their language because it is a good web app DSL. Nothing wrong with that, except that it doesn't scale (webapps scale, but they do it by scaling the database, not the language).
Piumarta seems to be a very sharp guy, but it's strange that a software project that is supposed to radically simplify the software stack still doesn't appear to have a working prototype of a complete two-kernel (pepsi+coke) system, almost five years after the albert paper (http://piumarta.com/papers/albert.pdf) that sketched out the basics was written. Kay keeps talking about how cool it is, and Piumarta has given at least one talk about how cool it is (http://www.youtube.com/watch?v=cn7kTPbW6QQ), but as far as I can tell it doesn't even exist yet. There are working pieces (which are each tens of thousands of lines of code), but from the outside there doesn't appear to be a working pepsi+coke system yet, let alone iterations on it. The VPRI progress reports don't even mention it.
VPRI seems all over the place, and Kay is talking about objects with AI-complete interfaces now. The mailing list is dead, and the wiki is pretty much dead. There's more information on Piumarta's personal website than anywhere else. I know it's supposed to be blue sky research, but it still seems weird.
My impression of the whole thing is that "complete" reflection/self-description is not a good foundation for minimalistic systems.
Well, I grew up in the culture too, and I guess I drank the Kook-Aid. If it strikes any chord in you at all, you should probably go for it. If you want my advice, don't do what everyone else is doing. Not everything has to be a social networking webapp. Get off the net and read a book once in a while. Be in a hurry, but be smart and thoughtful about it too. Always Be Creating, but make it something you'll learn a lot from, even if it fails.
But why care about my advice? There are so many other people who will tell you what to do.
Note that Fred Brooks argues for conceptual integrity, provided by a single human being, as the most important guarantee of product quality. If you use components, then you are accepting a system partitioning that has been decided many layers above you. If you design languages, then you cut out most of those layers. This gives you far more control over product quality.
Yeah, it's hard. Quality is hard. If your primary goal is anything other than quality, you will probably not produce a product with much of it. That's the real reason why there's no silver bullet.
If you use an exclamation point, you incite the user to anger; if your message cannot be perfectly understood every time by every person with a quick skim at 30% attention, they will click a random button because they have better shit to do than read the stupid dialog box that you put there because you couldn't be bothered to come up with a sensible design.
The user has a job to do. They want to do that job. Your job is to help them do their job and make the computer disappear, not remind them that they are using yet another piece of shitty code in a shitty program on a shitty and infested piece of junk that they would destroy with a baseball bat, like that guy in Office Space, if they could do it without getting fired.
I would argue that most non-technology companies would be best served by employing a single very good software engineer, maybe two or three if the company is very large. If the company is small then the one engineer doesn't even have to be all that brilliant. You can't do this if you have to administrate a typical IT ecosystem, but if your company is not a technology company, why do you need a typical IT ecosystem in the first place? (Because no one knows how to do anything outside of one, and even if you can find someone you can't find a replacement. Therefore every company must support a relatively large and complex ecosystem whether they want to or not.)
The core observation of Worse is Better is that the 50%-80% solution, designed to be easy to replicate, is more popular than a 90% solution that is more difficult to replicate, because the worse solution will spread faster, gain a larger community, and can then evolve to an 85% solution and will not need to evolve further because users will have been conditioned to expect less.
These arguments appeal because they are basically correct descriptions of a common phenomena, but if you simplify the message to "mediocrity is good" then you miss the point. Mediocrity of product is good, but only if it allows for a 50-80% solution to an existing problem and only if that is the problem that you want to solve. Mediocrity of skill is also good, but only if your goal is to look good to managers of mediocre software products and if you have no desire to move beyond your current domain of expertise at anything beyond a snail's pace. Note how Gabriel says that C is not good enough for AI: it is a great example of this, and also of what causes people to start believing in mediocrity; namely becoming overly discouraged after working on a problem that is far too difficult to solve with current tools and levels of understanding.
I think there is a correct observation in this article as well, and that is that putting a lot of effort into designing the right thing without getting any feedback from users up front or during the process is a terrible form of premature optimization. I agree with this observation and wish it were obvious to everyone, but clearly it is not. But the real question is who are your users and what do they demand? Here the writer goes off the rails by attempting to argue that users want mediocre software, when he really means that users want software that does something very similar to the software that they already have.
The distinction is blurred by the fact that the software that users already have was probably created by someone who sacrificed quality for time to market. The problem with not making this distinction is that you fail to recognize just how much quality remained after those sacrifices had been made.
Microsoft is a good example of this. Many people like to point out their lucky breaks, their rapacious acquisition strategy, and their monopoly preservation techniques, but it is also important to remember that Microsoft, for all its bloated bureaucracy, began with a strong technical culture and has managed to retain much of that culture as it has grown. It has an excellent research division, one of the few remaining in industry (not that Microsoft is much better at leveraging it than, say, Xerox was). If Microsoft is mediocre, and it is, its level of mediocrity is higher than most people's best effort. If you think you can beat Microsoft at anything remotely large scale with a strategy of mediocrity, well, you deserve what you get.
Linux is another good example here. It is a prime case of worse is better culture; initially based on a clone of a conservative OS design, never having ambitions beyond POSIX compliance as a way to spread everywhere, and repeatedly trying and failing to get a foothold on the desktop by slavishly copying Microsoft. Apple may not beat Microsoft, but it is thrashing Linux on the desktop with a strategy of tight control and emphasis on quality. Linux is mediocre all right - too mediocre to succeed outside of the server market, and even there it is probably not as good as whatever BSD best fits your needs. The real success of Linux is when it leverages its large porting culture to spread to platforms with no alternatives. And you probably aren't even as good as the core Linux developers. Hope you're not as ambitious.
Take a look at Google, perhaps the biggest challenge Microsoft has faced yet. Did they get where they are today by being more mediocre than their competition? Quite the opposite, I think.
The secret of mediocrity is that it is more helpful as a way of capturing a mass market than you might think. The secret of quality is that it allows you to create a market that doesn't even exist yet. Do you think every mass market lasts forever? How do you think they die? How do you think their successors began?
So yeah, be mediocre, but you will be at the bottom of a long chain of increasing mediocrity, and your ambitions of being big and successful some day will never be more than delusional fever dreams. Have fun with that.
The message here is not that really that mediocrity is bad or that quality is good. The real message is that you should think carefully about what exactly mediocrity and quality mean in your situation. These are meaningless terms in the abstract. Ignore the details at your peril. Don't let "premature optimization is the root of all evil" turn into "mediocrity is better than quality" turn into "I can be lazy and get away with it" turn into "I have no job, there is no market for my skills, and I have lost the ability to learn new ones." Don't live your life by platitudes at all. Think a little bit.
It allows for smoother anti-aliasing at the cost of some portability (things change if the display is rotated, not all displays have the same sub-component configuration, etc).
Three cheers for not being swayed by appeal to authority, but I'm curious about what you think counts as "business OOP" that doesn't count as "enterprise," as "enterprise" seems vague enough to encompass pretty much anything.
Your critique of lists and conses is again centered on the notion that documentation and encapsulation should be done in code and enforced by the machine. These things may well be necessary to build an economy of software modules in a closed source world, but the original article is just one example of the brain damage that this sort of world creates.
I'm glad you've been exposed to functional concepts, and I don't think that business developers are idiots, but I do think they live in an environment that is by and large toxic to good programming practices. I'm not paranoid, I just see a lot of evidence for the validity of Conway's Law.