February 28, 2006
Typical Open Source Software Moment
The thing open source advocates always tout about open source software is that you can open the hood and poke around and change things if necessary. The ability to customize your app and the source code level is nothing short of Real Ultimate Power. (My friend Mark said that he saw a OSS guy totally uppercut some kid just because the kid opened Windows)
So last night, I put that to the test. I wanted to find out some details about how Erlang handles some low level file operations. My new Erlang based CouchDb engine, which is now storing and retrieving documents, seems a little too fast right out of the gate, and I suspect it's because the flush operations ('sync' in Erlang) I'm performing aren't actually flushing to disk. Which is possible because the Erlang documentation says the 'sync' operation doesn't work on all platforms. But it doesn't say which platforms. Swell.
But wait! It's open source, I'm a coder! I can just look at the code and figure it out!
And yet, after many hours of searching the Erlang source code, I still haven't figured out how Erlang translates file system operations down to OS level calls. I've scanned many thousands of lines of source code, I've searched for file function calls in every file API I can think of. And still I can't figure out how it's doing it. I've looked at lots of interesting networking code, and I now have a better understanding of how the Erlang source is organized. But by just looking at the source code, I haven't been able to answer my rather simple question: Do Erlang disk flushes actually work on Windows?
This isn't to say it's impossible for me figure out, but it going to require me to understand the core underpinnings of Erlang's bootstrapping process. Essentially, to answer a very simple question about the Erlang source code, I now have to spend who knows how many hours becoming familiar with the guts of Erlang's runtime. And while that's kind of fun, it isn't helping me get Couch built. It's a big distraction.
For now I'm just going to write it down as a possible outstanding issue. Often answers to questions like this pop up at unexpected times, so its best just to move on and wait for it. If I never find the answer then I'll pester someone who's familiar with Erlang source. If the answer is that I must modify the source to get the behavior I need, then I'll cross that bridge when I get to it.
Having the source code isn't quite the benefit open source advocates would have you believe. It isn't like having detailed instructions for a model battleship, it's more like all the parts were dumped out onto the table. Good luck with all that.
Why Features Don't Matter Anymore
6) Any feature that requires learning will only be adopted by a small fraction of users.
Learning new features, even the ones that a user might find interesting or intriguing, is a real issue: nobody has time. Getting consumers to upgrade and adopt new features is one of the biggest problems software publishers face these days.
Read this article. Please go read this article.
The Internet is so filled with die hard geeks we seem to have forgotten that there is actually a whole world of users out there who don't give a shit about computers. Because the Internet allows us to connect to geeks around the world, it seems like computer literate people are all around us. It's an illusion.
Most people don't care about computers, they use a computer because they MUST, not because it's so fucking great to be using a computer all day. They use word processors and email to correspond about subjects completely unrelated to computers, the internet or technology. I know, its hard to fathom, but trust me on this.
These people don't care about your flexible, brilliant architecture. They don't wish to tweak settings. They don't want to spend more that 10 consecutive seconds confused. They just want simple, they want to get their task done and move on. They don't want to spend time learning anything because they know they'll probably just forget it long before they'll need to do it again anyway.
If you are selling to committees (i.e. expensive business software packages) then competing on features is somewhat effective. It's the checkbox game when there is a big committee, mostly because design aesthetic and usability are far too subjective to be discussed by committees. Instead, Brand X and Brand Y are pitted head to head on a big chart, and the one with the most checkboxes has the visible advantage.
People think "Well, it does have a SOAP api, in case we ever decide to go that way..." and never check to find out that the SOAP apis are buggy and barely useful because they aren't evaluating the software on the SOAP merits. But they feel better knowing something is there already in place, just in case. This is why so much enterprise software is barely usable crap, this is why your office phone has 100 features that you can't figure out how to use.
But when creating software for individuals, simplicity sells. Lots of features, especially the "powerful" features users need explained to them, do just the opposite and make people feel insignificant, stupid and most of all powerless. People just want to get a very specific thing done, and then MOVE ON. They don't want to learn anything, they aren't interested in catching the next wave of technology. It's not because they're dumb, it's not because they're lazy, it's because they have other interests that occupy the bulk of their thoughts, and they aren't computer related.
Now go read the article.
Bonus link: Why Johnny Can't Program
February 19, 2006
WYSIWYG form builder. If only it had a simple database backend...
February 16, 2006
Dual Monitor Gripe
When coding in Erlang, all the documentation I use is browser based, so I like keep a Firefox browser window open in my second monitor that is dedicated to Erlang documentation.
However, to accomplish this, I need to:
1. Open the link in a new browser window (not just a new tab).
2. "Restore" the window.
3. Drag the window to the second monitor.
4. Maximize the window.
This works great, until I want to open a new browser window, in which case instead of opening to my main monitor it opens to the second monitor in front of my Erlang documentation.
To remedy the situation, I must:
1. "Restore" the new window.
2. Drag the new window to back to the main monitor.
3. Maximize the new window.
After all this finally my second monitor is useful and my browser is behaving correctly. This is an awful lot of steps just to browse documentation on a second monitor. The only other option I know of is to dedicate the use of another browser (IE in my case) to browsing in the second window. It works, but I'd much rather use the same Firefox browser in all my browser windows, with the same extensions, bookmarks, etc. Anyone know some tricks in this area?
This whole dual monitor thing just isn't as seamless as it should be. For example, while working in Visual Studio ('03), I often would like to view a project source file in the second monitor, but I can find no simple way to do it. This seems like a really obvious feature to me. Maybe Visual Studio 2005 fixes this?
So far, I've found using dual monitors to be almost as frustrating as it is useful. Hopefully this will start to go away as applications increasingly become multi-monitor aware, but for now I'd just settle for my browser to deal with it slightly better.
February 12, 2006
Speculation on programmer/libertarian correlation
Since I usually view the world as a complex, non-deterministic machine and I'm Libertarian, I'd say this guy has me completely nailed. A long but very interesting read.
Programming Advice to NOT follow
Don't do what Donny Don't does.
February 9, 2006
Erlang and CouchDb
My work on Fabric is now done, in that I'm now doing just-in-time feature development. That's not to say Fabric is feature complete, but its close enough to be usable, all the core language features and syntax is implemented and it has a good start on a test suite. From this point on, all features will be added as needed.
So now I've started re-writing CouchDb in the concurrent functional language Erlang. Originally I was planning on wrapping my C++ code with an Erlang server, but I've decided to rewrite as much as possible of the old code in Erlang. Now this may seem like I'm abandoning many months of work, but the truth is it was helpful for me to work out the design of the disk storage structures CouchDb in a language I was very familiar with, then re-implement in Erlang. Most of the actual work wasn't coding but design and research, and that time isn't wasted. Also, it would have been overwhelming to design the architecture at the same time trying to get my head around Erlang, I'm not sure that would have been a productive way to about it.
Now after about a week of serious work with Erlang, I'm convinced I made the right decision. Erlang has been much easier to learn than I thought it would be (way easier than Antlr IMO), and already I'm more productive with it than I've been in C++, plus networking, concurrency and fault-tolerance are built in to the language core, its not just some add-on library. This has much to do with Erlang being specifically designed for use in telecomm server applications, and I think makes it particularly well suited for a database engine and server. My plan has always been to make CouchDb massively scalable with node partitioning, Erlang will make that easy.
So, in case you can't tell, I'm very excited about Erlang at this point. It provides me with a much better level of abstraction for this work, much of the drudgery I was experiencing in C++ is now gone. If my high productivity in Erlang keeps up, in a few more weeks I should have matched all my existing C++ functionality, but now with a robust, concurrent server architecture. Yowza!
February 4, 2006
Passion of the Notes
I was at Lotusphere in Orlando recently, and had great time. The conference had an energy and enthusiasm that's uncommon in the business world. I think it'ss because IBM finally is moving in a direction that actually makes sense, and has the right people calling the shots.
One thing I was really struck by was how passionate so many people are about Lotus Notes. The Notes community is a community that I was once a very active member of and I really miss. Is it any coincidence that the most advanced "social software" platform also has the most tightly knit, passionate technology community?
The people at Lotusphere almost uniformly love Notes, and coming to the conference is Nerdvana, they are surrounded by people that share the same passion. These are my kind of people, smart and creative and they flat out love Lotus Notes. They use it every day to solve real world problems. They love that it does stuff the almighty Microsoft still can't come close to matching. They love that it works like their brain works, it just clicks. Some people aren't sure why they love it so much, they just know it makes them heroes at work. Notes rocks.
But I was also struck by how many people were otherwise alone in their passion. Getting excited about this thing, a software tool, is something they feel like they aren't allowed to do. Colleagues, friends, relatives making them feel like their interests are silly. Stories of coworkers being derisive or outright hostile, the typical Notes sucks stories, nitpicking every flaw while conceding none of its strengths.
This is not unique to Notes, of even software, people everywhere with intense interests are brought down by others. These people who like to squash enthusiasm I like to call "cynical assholes". These are people with no real passion of their own, and it annoys them to no end to see others who do.
The cynicals assholes will make you feel like being enthusiastic about your work is somehow wrong. It's stupid, or you're stupid for liking it. Fuck those people, it's just their insecurities surfacing, trying to bring you back down from your excitement. "Get back in your place, who do you think you are? You think you're better than me?" Oh yeah, fuck you.
In every industry, advances are made by the people who are oddly obsessed with something most people couldn't care less about. It's not dumb to be excited about software, it's not dumb to be enthusiastic about your job. It's not. There are people who are passionate about cars, about retailing, about accounting, about cooking. It's the greatest thing to be passionate about something, especially when it's your job.
Software can empower people, free them from drudgery and let people focus the more creative elements of work and life. When you create software you are empowering others. How does that not make the world a better place? How can that not be important?
It is important and it does matter. Don't believe the cynics. It's okay to have passion. It's better than okay, it's great. Go with it.