Our boys keep getting bigger! Surprising, I know. I had the studio gear set up and we threw them in there and took some pictures... love these!
Technorati Tags:
photography, kids, portrait
Our boys keep getting bigger! Surprising, I know. I had the studio gear set up and we threw them in there and took some pictures... love these!
Technorati Tags:
photography, kids, portrait
Posted at 12:30 PM in Photography | Permalink | Comments (0) | TrackBack (0)
Wow. We went to the U2 concert Wednesday night, and they did not disappoint. This is a band I've loved for more than 20 years, who have continued to produce new music throughout that time, and who have deeply impacted the world, far beyond music. I last saw them live 17 years ago, and seeing them again felt like seeing history. When they were finally done, after a surprisingly long (and wonderful) set, they walked off, together, on the long public walkway off the stage, not via the hidden walk underneath it, taking their time to enjoy and respect the fans.
The show was fantastic. I thought the sound was quite good, especially given the venue (Reliant Stadium), and of course, the stage was amazing and ridiculous and incredibly fun to watch.
The stage, before the show (shot with Pano on the iPhone):
The high point for me came fairly early in the show, when they played "I Still Haven't Found What I'm Looking For". It's a beautiful song, and the crowd was singing, and the sound was perfect, but there was something more; it was one of those moments infused with truth and history and beauty and community and love and worship.
I think my second favorite moment was "With Or Without You", near the end of the show. The lighting was incredible and the song sounded SO good. It's such a simple song in many ways, and Edge's guitar was just beautiful.
The articulated cylinder of LED screens was pretty amazing, and I would have loved to have seen those spotlights from outside the stadium:
They made good use of the stage an interacted with fans in 360 degrees. Here's Edge playing at the "back" of the stage:
It was all pretty awesome.
Technorati Tags:
houston, u2, concert
Posted at 09:59 AM in Experiences, Music | Permalink | Comments (1) | TrackBack (0)
Posted at 09:03 PM in Photography | Permalink | Comments (0) | TrackBack (0)
Wow, I've been getting a ton of "@-reply" spam in my Twitter mentions feed. I propose the following algorithm:
Something along those lines would prevent almost all @-reply spam from showing up in mentions feeds, I think. If Twitter is to succeed, this really needs to be dealt with (unfortunately).
Technorati Tags:
twitter, spam, mentions
Posted at 08:31 AM in Social Media, Twitter | Permalink | Comments (3) | TrackBack (0)
We went on a road trip to Chicago for my sister-in-law's wedding (which I was photographing). My wife was extremely kind and researched all of the best coffee places along the route on CoffeeGeek and Barista Exchange, so I actually had good coffee in almost every city we spent any time. The notable exception was Kentucky, there was just not much there (apologies to any Kentuckians).
I did have one Starbucks latte (in Kentucky). It was wretched. I actually didn't drink it. Anyway... here are the places I went:
The Coffee Roastery, on Pearl St., Jackson, MS: I had to send my wife in because it was on a downtown corner and there was little parking to be found (and we had 3 kids in the car, of course). Got a latte, it was bad, I hardly drank it. Bleh.
Wired Espresso Cafe, on N. State St., Jackson, MS: Pretty good! Not a great latte, but far better than sbux or the one I got at Coffee Roastery. No art, though. I drank this one.
Kaldi's, on De Mun Ave, St. Louis, MO: Pretty good. Got a couple lattes for the road, they were good, not great. Better than anything I got in Jackson. No art, though.
Intelligentsia, on Jackson St., Chicago, IL: This is a weekday-only source of caffeination for Chicago folks, but it was closer to our hotel than the Randolph location (my favorite). Intelligentsia, of course, rocks. They're brewing on a 3-group Synesso, they have great coffee, etc. At this location, the temperature of my latte was a little hot, IMO, maybe 10 degrees hot. But excellent, as always, and good art. Blew away everything I'd had up to this point, of course.
Intelligentsia, on Randolph St., Chicago, IL: Ahhh... Saturday came and forced me to hop on the El to get over to the Randolph location, but I was rewarded with a perfect latte, beautiful latte art, and a ginger scone. It doesn't get better than this, really. I had maybe five lattes here over the course of our stay in Chicago, and they were all perfect. How anyone in Chicago can set foot in sbux, I don't know. Had a single-origin capp which was also excellent, though the latte is where my heart is. Also had a Clover of something that I don't recall now. Sad to leave!
Starbucks, Florence, KY: Worst latte ever. Except possibly one I had at Inversion back in Houston. Ugh. DID. NOT. DRINK.
Ray's Monkey House, on Bardstown, Louisville, KY: Decent latte. So much potential not being fulfilled! They roast their own, have decent equipment, with a little proper training they could make great coffee. It frustrates me when I find indie places like this that could be great but just aren't. Better than sbux, though. Side note: the whole time I couldn't help but laugh to myself about those "monkey-fighting snakes" in the edited-for-TV version of Snakes on a Plane (which I didn't see, but heard about, and with the name of the coffee shop, and, well, anyway...).
Crema, on 1st St. South, Nashville, TN: Great! We were debating which place to hit in Nashville when Heather found latte art pics from Crema, so it was decided. Had a brief but good conversation with the people there, and got a couple lattes for the road, which were excellent. Good art, the whole deal. Later on I figured out I was actually following them on Twitter already! (they're @CREMACREMA)
Primavera, on White Oak Dr., Birmingham, AL: Excellent. Had multiple lattes here (some for the road), all excellent. Good art. Again, great coffee people here... they roast their own, and clearly do a pretty good job of it. They sell Chemex gear, etc. I bought some beans to bring home. People of Birmingham, send them your business!
Cocoa Bean Pastry Shop, on Morris Ave., Hammond, LA: Decent coffee, not great, but great baked goods. This was a long shot and it turned out better than expected. Definitely better than hitting sbux. It got me home. :)
Technorati Tags:
coffee, travel, jackson, st louis, chicago, nashville, birmingham, hammond
Posted at 09:22 AM in Coffee, Travel | Permalink | Comments (1) | TrackBack (0)
I upgraded to Snow Leopard yesterday, and it is fantastic. Noticeably snappier in every respect. The Exchange 2007 support is great, it took a while to initially sync all my mail (mass quantities), but after that it has been singing along. Address Book integration is nicely done, it doesn't try to merge, it keeps your accounts separated, but provides an All Contacts view. GAL search works too (and in mail compose).
Snow Leopard comes with 64-bit Java 6 out of the box, woohoo! I loathe Java, but as I'm working with it now, I am very grateful for the massive speed upgrade, and the JDK 6 support.
I installed MySQL 5.1 x86_64 and it runs perfectly. The PrefPane is 32-bit and requires an (automatic) relaunch of System Preferences, but that's no big deal, it is used infrequently.
*Everything* is faster. So far the only casualty is Checkpoint SecureClient, which I knew in advance.
Good stuff, Apple!
OH!! I also got back almost 15G of HD space! LOVE.
Technorati Tags:
apple, snow leopard
Posted at 01:20 PM in Apple, Macs | Permalink | Comments (0) | TrackBack (0)
I have said before that corn bread may be the best food on Earth, but I may amend that to include a slight preference for spoon bread. My grandmother recently died and the family compiled some of her recipes. Spoon bread was one of my favorite things she made as a kid (2nd only to banana pudding, I think).
If you're aren't familiar with spoon bread, it's a variation on simple corn bread, that results in a mushy, slightly sweet, buttery "bread" that you eat with a spoon. TO. DIE. FOR. Literally, maybe, because it absolutely must be smothered in butter to serve.
Here 'tis:
Mix water, cornmeal, salt, sugar in saucepan over medium heat. Stir until thick. Remove from heat.
Add butter, stir as it melts. Stir in soda. Beat the egg into the buttermilk and stir into cornmeal mixture.
Pour into a greased casserole. Bake at 350 F for 30 minutes, or until well set and nicely browned on top. (I needed 35+ minutes)
Serve hot (immediately), with butter.
Technorati Tags:
recipe, spoon bread
Posted at 08:03 AM in Food and Drink | Permalink | Comments (1) | TrackBack (0)
This morning I woke up to find Twitter had ceased to exist. Off the map. Gone. How will I tweet about Twitter being down?! Then I went to Facebook to post about Twitter being down... but Facebook was down too!! It's the Twitpocalypse!! What do I DO??
Then I remember I had a blog. Haha, we'll bring out the big guns. Take that, o thou whale of fail.
So now I have blogged about being unable to update Facebook about being unable to tweet on Twitter. Social media, what hast thou done to us??
:)
UPDATE: But I can't post a link to this on Twitter... sigh.
Technorati Tags:
twitter
Posted at 08:26 AM in Social Media | Permalink | Comments (3) | TrackBack (0)
No, not of this blog, though it will be getting there in not too many years. :)
My wife and I celebrated 10 years of marriage last week! We went to Mackinac (pronounced Mackinaw) Island in Michigan and had a fantastic time. No motor vehicles are allowed on the island (except emergency vehicles), so everything is got to by foot, horse, or bike. We loved it.
I took a bunch of picture (you're shocked), and put together a collection of black and whites that capture Mackinac for me. Here they are:
If you're ever looking for advice on Mackinac dining, lodging, etc., hit me up on Twitter or email. I can't recommend it enough as a "change of pace" vacation. We went sans kids, too, which helped.
Technorati Tags:
photography, travel, mackinac
Posted at 02:09 PM in Photography, Travel | Permalink | Comments (0) | TrackBack (0)
Posted at 02:02 PM in Weblogs | Permalink | Comments (0) | TrackBack (0)
So I upgraded to the 3GS on release day.
You may have seen my E71 vs. iPhone review last October. Well, the 3GS pretty much reverses that conclusion, and then some. Here are some of the topics, revisited:
Voice quality: Shockingly, iPhone 3GS. I was very surprised, but the 3GS voice quality (compared to the original) is much better, and the radio works far better in our house than the original did. I think I prefer the equalization on the E71, but that's only when comparing a tinny-sounding source in strong signal.
Responsiveness: iPhone 3GS, by far. The speed boost and 3.0 did the trick. It's fast, and typing is fantastic.
Email: iPhone 3GS. The better UI, now with plenty of speed, server-side search, fantastic Exchange support, etc.
Cellular/3G data: iPhone 3GS. I had an original iPhone before, of course, but the 3G on the iPhone 3GS is great, and probably in part due to the processor bump, things just go more quickly.
Maps: Tie. Again, responsiveness has made up the difference. I still love physical keys here, but the iPhone has other features that make up the gap, so I'd say this is a tie now.
Home Screen: iPhone 3GS. The bugs in the E71 have bitten me lately, and with the processor bump, the iPhone is more responsive and I get to things quickly. Amazing what a little speed will do for your user experience.
Contacts: iPhone 3GS. Again, processor and OS bump made search fast and easy. Very nice now.
Typing: iPhone 3GS. Typing is now very fast and responsive. I'm MUCH faster on the 3GS than on the E71.
Local connectivity: Tie. iPhone supports stereo bluetooth now and some interesting Wi-Fi stuff.
Tethering: Tie, once ATT turns it on. iPhone has this, just needs the bloody carrier to support it.
Camera: iPhone 3GS, by far. MUCH better photos and video, autofocus, etc. And no pathetic "flash" which ruins every picture.
Battery Life: E71, because it doesn't get used. The iPhone 3GS does suck down the battery if you use it a lot, but that's true of anything. The fact is, you want to use it a lot. Not so much with the E71.
Search: iPhone 3GS. E71 doesn't have it, or it's application-specific.
I'm no longer "bi-phonal". I carry the 3GS only. It does Exchange better, it does phone better, it does Internet WAY better, it has orders of magnitude more and better applications, it has a coherent platform, the UI is great, and so on.
Technorati Tags:
apple, e71, iphone, nokia, review
Posted at 04:49 PM in iPhone, Nokia | Permalink | Comments (6) | TrackBack (0)
I learned this from Max at Catalina. It's very simple, but delicious and refreshing, especially in the insane Houston heat this summer. All I do is fill the Chemex up to its "naval" with ice, then brew a pretty light 1/2-pot of drip coffee on top of it. I have a 32oz Chemex, so I brew for 16oz. That's it. Serve over lots of ice, of course. Awesome!
Technorati Tags:
coffee, summer
Posted at 05:21 PM in Coffee | Permalink | Comments (0) | TrackBack (0)
For the #twitcode contest (see: Twitter contest: what can you code in 130 characters?)
This Erlang code (98 characters) spawns N processes in a ring and sends a message through the entire ring. Try N=1000000 (1 million processes!!). In 135 characters, I could pass M messages through the ring, but there was no way to get that under 130. So this passes 1 message.
a(N)->X=b(self(),N),X!m. b(P,0)->P;b(P,N)->b(spawn(fun()->l(P)end),N-1). l(N)->receive T->N!T end.
Complete with module definition and export:
-module(r). -export([a/1]). a(N)->X=b(self(),N),X!m. b(P,0)->P;b(P,N)->b(spawn(fun()->l(P)end),N-1). l(N)->receive T->N!T end.
To run:
$ erl +P 2000000
Erlang R13B (erts-5.7.1) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]
Eshell V5.7.1 (abort with ^G)
1> c(r).
{ok,r}
2> P=spawn(fun()->r:a(1000000) end).
<0.39.0>
3>
It should run in under a minute (w/ 1 million processes) on most machines, maybe noticeably less. Obviously 1000 processes or so is instantaneous.
Technorati Tags: programming, twitter, twitcode, erlang
Posted at 10:09 AM in Code | Permalink | Comments (0) | TrackBack (0)
Yelp sent me an MGD 64 ad in email. I'm offended. Seriously. How can a site dedicated to reviews (and thus, by inference, to "quality") send me an email with an ad for such a wretched beer, sold by a mega-corp, the enemy of micro-brews, quality, and ethics?! I yelp no more. They crossed the line. Yelp, you're dead to me.
Technorati Tags:
yelp, beer, ad, bad
Posted at 08:37 AM in Business, Food and Drink | Permalink | Comments (2) | TrackBack (0)
If you write code and you haven't learned Erlang, you should do so, right now. It will stretch your thinking, for sure, but it may do much more than that.
Erlang represents a fundamental shift in the way we think about solving problems. The fact that it is a functional language is part of the necessary reality that makes Erlang successful, but it is not the primary reason. What makes Erlang very special is its concurrency. Erlang is a language for "concurrent" programming and a virtual machine (like Java) for running compiled Erlang code.
The Java language is almost always considered in light of its runtime environment, the JVM. Erlang even more so, it would not be what it is without the runtime that implements it. So when I say Erlang, I mean the whole package, not just the language.
Erlang is oriented around concurrency on a massive scale. The fundamental unit of thinking in Erlang code is the process. One Erlang interpreter/virtual machine can handle millions of concurrent processes. The processes interact by passing immutable messages (everything is immutable BTW, Erlang uses single-assignment variables).
Guess what? The Internet IS concurrency. Practically any piece of software connected to a network these days must handle concurrency. Most languages do a pathetic job of this (or no job at all). They don't give us tools to build concurrent systems with any kind of ease. Most languages make it quite difficult, in fact.
Erlang makes it so easy and so natural that you begin to think about solving problems differently. The ability to run millions of concurrent processes can radically change your approach to a problem. What are social networking and large user-driven sites always running into? Scalability. How do you scale with all these users?
There are two problems here, the first being how do you scale to handle the load, and the second being what do you have to sacrifice in terms of code elegance, simplicity, etc. to get there? Will the complexity of your system grow with the scale? More little optimizations that disguise the real logic of the application?
What if you could run a unique process for every single user on your system? How would that change your approach?
That is what Erlang makes possible. Instead of a pool of workers crunching away in serial, individualized processes working in parallel, on a massive scale.
Plus, it is built to cluster, and all of its message-passing works identically across a cluster as it does locally. So if one machine can handle a million or millions of processes, how many processes could you handle on a large cluster?
One of the exercises in the Erlang book is to write a process ring benchmark. The idea is that you create a ring of N processes and then pass M messages through the ring and see how long it takes. On my Mac Pro (couple years old, quad-core 2.4GHz, 6G RAM), I ran the benchmark with 1000 messages and 1 million processes (!!). That means Erlang passed 1 billion messages. The benchmark ran in 8 minutes, which boils down to 2 million messages every second, or 2 messages every 1 microsecond. That's amazing. And powerful.
Another interesting tidbit: the statistics report "run" time and user time. User time was half of the run time. Why? Single-assignment + message passing = no locking, no contention = SMP-friendly. Erlang is built to run on multi-core computers. So it spent twice as much time "on processor" as it took in "real life" because it was using the multiple CPUs/cores offered by the Mac Pro.
Here's the code:
-module(ring). -compile(export_all).
run(M,N) -> Pid = start(N,M,self()), statistics(runtime), statistics(wall_clock), send_messages(Pid, M), receive finished -> void end, {_, Time1} = statistics(runtime), {_, Time2} = statistics(wall_clock), io:format("~p ~p ~n", [Time1, Time2]).
start(N,M,RunPid) -> spawn(fun() -> start_master(N,M,RunPid) end).
send_messages(Pid, M) -> for(1,M,fun() -> Pid ! {init, message} end).
for(M,M,F) -> F(); for(N,M,F) -> F(), for(N+1,M,F).
start_master(N,M,RunPid) -> LastPid = start_ring(self(), N), master_loop(LastPid, RunPid, M).
start_ring(Pid, 1) -> spawn(fun() -> loop(Pid) end);
start_ring(Pid, N) -> NextPid = spawn(fun() -> loop(Pid) end), start_ring(NextPid, N-1).
loop(NextPid) -> receive stop -> NextPid ! stop; Any -> NextPid ! Any, loop(NextPid) end.
master_loop(Pid, RunPid, 0) -> RunPid ! finished, io:format("Finished~n"), receive after 100 -> Pid ! stop end;
master_loop(NextPid, RunPid, M) -> receive stop -> NextPid ! stop, io:format("Master stopping ~n"); {init, Msg} -> NextPid ! Msg, master_loop(NextPid, RunPid, M); _Any -> master_loop(NextPid, RunPid, M-1) end.
Posted at 08:16 AM in Code | Permalink | Comments (0) | TrackBack (0)
A friend recently asked me why I like Twitter. I find this a difficult question to answer, much like explaining Twitter is difficult. You can explain what is is in a couple sentences, but to explain why you would want to use it is much more difficult. That's not because there aren't good reasons and everyone on Twitter is just being silly... quite the contrary, I find it difficult because there are lots of reasons, but none of them are easy to quantify.
It's a little bit like "why do you like to hang out with your friends?" or even "why are your friends your friends?" Quantifying an answer may not be so easy, it's complex and involves more than simple logical thought processes.
Now, some people (a lot of people now, it seems) are on Twitter because it's "the next big thing" and they're in PR or media or "social media" and Twitter is just another channel to deliver a message or content. That's not me. I'm not there to promote anything, and I largely ignore those who are.
I started on Twitter in part because there was a growing population of Houston folks, across a bunch of my interests (start-ups, software, photography, music, etc.), getting on Twitter. The majority of the people I follow are local, and Twitter has been a catalyst for networking with good people on both business and personal levels, and continuing to interact with them.
I've tried to describe Twitter as "social networking at the right speed", meaning it's "faster" than Facebook, MySpace, or email, but "slower" than IM. You don't expect to have a conversation like you would on IM, but you do expect to have conversations. They're just slower and more fault tolerant.
Part of what makes Twitter work is that it's perfectly flat. You don't join the right groups, friend the right bands, etc., you're just you. Everyone is just themselves (except for those in the PR camp, but we're ignoring them). People don't get silo-ed into buckets, you just get the people, with all their interests, all their comments on the world. The same people will be talking about photography one minute, programming the next minute, music after that, etc. You get a picture of a whole person, and discover that people are pretty interesting.
And on the other end of the spectrum, Twitter is global, so I have occasional interactions with people from all over the world, again in this flat space that's just a bunch of people. The "just a bunch of people" flatness and connectedness seems to have fostered a culture of respect and openness, vs. the somewhat flame-war-ish culture that has developed (to a certain extent) around blogs.
Twitter is direct. I can work out lunch arrangements or a meeting about a business opportunity very quickly, with multiple people, from anywhere, as long as I have at least SMS access. This gets at the heart of what Twitter is... Twitter is another level of indirection (for you C programmers), or another layer (for you networking people), for connecting people, and that, combined with its simplicity and ease of operation, makes it very powerful. It's a big lever and a light touch is all you need.
Twitter is casual. Most of the conversations I have on Twitter are the kinds of conversations I might have with friends. They aren't stuck in some "virtual" reality, they extend into day-to-day life. Most people on Twitter are real and they share mundane things right next to big things, and that's part of what makes it refreshing. Humans "do life" in little moments, in ordinary activities. Real relationships come from sharing those things, and the flatness, immediacy, and simplicity of Twitter allow that kind of sharing to actually work on the Internet.
Finally, Twitter is a powerful tool for "grass-roots" information. All of that connectedness and genuine interaction leads to a lot of real-time information sharing, everything from restaurant criticism to traffic reports to emergencies, with real results. Real people help each other, inform each other, etc. This is what the media have picked up on and part of why they now can't speak a sentence without saying something about Twitter.
To really "get" Twitter, you need to really use it and follow people and interact and grow your "network" enough to where these things start to happen. So there is some intentional effort involved. Maybe I hit it at the right time, but it has really been worth whatever effort I've put in. My life is significantly enriched because of the people I know on Twitter.
So that's some of what I love about Twitter. Maybe it answers the question. You can follow me on Twitter if you like. I follow real people back most of the time.
Also check out @BrentO's Twitter FAQ.
Technorati Tags:
love, twitter
Posted at 09:37 AM in Twitter, Web/Tech, Weblogs | Permalink | Comments (0) | TrackBack (0)
Posted at 08:27 AM in Twitter, Web/Tech, Weblogs | Permalink | Comments (0) | TrackBack (0)
The Lisp function has called itself again, it seems. Or maybe it calls itself often, and I have just failed to notice it until now (see http://xkcd.com/297/). In any case, Lisp is the programming language that programmers are taught to venerate. Ogle its perfection, its code and data dual nature, its simplicity, its elegance, and so on.
I wholeheartedly support bashing new concepts into programmer brains using Lisp. However, I fail to see its appeal for writing real software. Part of developing software systems involves programmers typing in code, reading that code, and re-reading that code 6 months later. Other programmers are going to come along and read that code, too. If you've ever looked at the source code for a large Lisp system, you may notice that its syntax does not lend itself to being understood. It is difficult to read, and even more difficult to interpret, because there is SO MUCH LIST PROCESSING GOING ON (Lisp = List Processing).
Lisp is difficult, in part because it represents new concepts to most programmer brains, but also in part because it's just tedious. Very nice that you can represent every data structure as a list or list of lists, but that doesn't mean you should. Just because it is possible to treat all things as exactly the same and have no keywords doesn't mean it makes for better software. I think it just makes for easier compilers. Lists just aren't a natural way to represent data to humans.
All that list processing produces code that is syntax-heavy (parentheses and list processing) in a language that essentially has no innate syntax. It's difficult to read, just like almost every Perl script is difficult to read. There's a lot of syntax happening. Why? Because it makes the compiler's job really easy. Ummm, why do I care if the compiler has an easy time of things? The compiler should work hard to make my life easy, and to make it possible for me to write better, more maintainable, more legible, simpler code. In Lisp, the programmer is responsible for constructing the entire AST himself.
Programming doesn't have to be difficult to be powerful. I reject that notion as the supposition of lesser programmers who've bought into a culture that worships Lisp and its kin. Learning Lisp may grow your brain (a good thing), but deploying real software in it seems like less of a good idea. To think that we've failed to come up with any more good programming language ideas in 40 years is ridiculous.
The Lisp culture reminds me of the "if you only knew what we knew" arguments that get trotted out by "national security" people every so often.
Tell you what... let's have a contest. You (hypothetical Lisp worshiper) implement a Twitter clone in Lisp, and I will implement it in a language of my choice (NOT Lisp, probably Erlang). You must provide an HTTP-based API in addition to a pleasing web UI. Both must support username/password authentication. You must be able to demonstrate support for 500,000 concurrent users with sustained message rates over 1000 messages/sec. You must store all messages. 50% of the users will have 50 followers. 35% will have 200 followers. 10% will have 1000 followers. 5% will have 10,000 followers.
When both systems are complete, we will note how many hours (roughly) it took to build each system, and how many lines of code (this is not always a good metric, but we won't abuse its relevance), and what deployment requirements there are to reach the scalability goals.
Then we will take a good programmer who has not programmed extensively in either language, and ask him to understand each set of source code and ask him to make some modifications. We'll subjectively analyze how things go in each system.
I think we will find that the non-Lisp system is less code, more intelligible, easier to extend, faster, and easier to deploy.
Lisp as a religion needs to die. Lisp as a set of interesting ideas worth learning should stay.
Technorati Tags:
programming, software, lisp
Posted at 06:33 AM in Code, Religion, Web/Tech | Permalink | Comments (0) | TrackBack (0)
Dear programmers of the world: take your pet "philosophies" and shove them where the sun don't shine. You're building an app that you want to SELL and your "philosophy" prevents you from implementing a major feature that many users want? You can rot.
You want a philosophy? How about this: build great apps that people actually want to us and that solve real problems for people.
For instance, Twitter clients. I love Twitter. I hate Twitter client developers (except TweetDeck). Why? Because they don't bloody listen to users. TweetDeck has how many users? Despite the mega-suck AIR UI? Why? Because it solves a major problem (grouping Twitter users), and solves it well. Is it perfect? No. Is is 100,000 times better than every other Twitter client because it makes a decent attempt? Yes.
Would I buy TweetDeck? I might. Would I buy a fantastic Cocoa app that had a similar implementation of groups along with a nice UI, low memory footprint, etc.? Absolutely. I would pay $40 for a high-quality Cocoa Twitter client. Is there one? Nope. Not even one.
Tweetie looks fantastic, but it is DOA without groups. I love everything else about it, and it pains me to shut it off and start TweetDeck, but that's what I gotta do, because a beautiful interface to an un-grouped Twitter feed is like the most perfect baseball bat ever made when I need to chop down a tree. Sorry, it doesn't work. It's dead.
If you want to implement what people need and then make it perfect by beating Twitter into implementing groups and transition from your local implementation to an API-based implementation, fine. Just do it. What a waste of an opportunity.
Technorati Tags:
twitter, tweetie, programming, philosophy
Posted at 12:05 PM in Code, Sage, Usability, Web/Tech | Permalink | Comments (0) | TrackBack (0)
@BrentO posted this over 8 months ago, and I just now saw it, while googling myself in the hopes of finding one of my old resumes laying around on the Internet!
Anyway, here goes... this is a very deep topic for me, so bear with me. :)
How old were you when you first started programming?
I think my first programming experience was in grade school, on TRS-80 machines ("trash-80s"), in BASIC. This was a mischievous child's dream, because although most people could bang out the programs the teacher wrote on the board, almost none of them knew what to do when their screen filled with the same lines of text over and over, ad infinitum. DoS (Denial of Service) at its best! (10 PRINT "YOUR MOMMA WEARS COMBAT BOOTS". 20 GOTO 10.) I vaguely recall building some incredibly simple game at the time, but it's been so long I may be making it up.
How did you get started in programming?
Not long after starting high school, our family got our first personal computer, a Leading Edge 8088 machine. It was awesome with its 640K of RAM. All we'll ever need, right Bill? :) Not long after, I produced a DOS manual for my parents, explaining the intricacies of things like "dir". Probably a year later (sophomore year?) I tried to teach myself Pascal. I had started working at a bicycle shop, so I had a little money, and I bought the Borland Pascal compiler which must have come with some introductory book, or something.
In any case, Pascal was a disaster. It was a very frustrating experience, mostly because the language felt so artificially limited. I did manage to program a little space game on our 4-color CGA display that would go into hyperspace and shoot laser beams, but I got tired of Pascal and let the whole thing sit dormant.
But, in the beginning of my senior year of high school, my mom began taking an intensive career-retraining course at DePaul University. It was a 9-ish month program designed to launch your career in IT software development (COBOL, JCL, etc.). I didn't pay much attention until she began taking a C programming class, got stuck, and asked me for help.
Let me tell you, to a born hacker not yet aware of his calling, who had only worked in BASIC and Pascal, programming in C was like injecting some kind of super-drug. THIS was freedom, this was power, this was programming. Pointers were what I'd been looking for. Raw, type-unsafe power, baby.
What was your first language?
Although I dabbled in BASIC and Pascal, I consider C my first language. It's the one I really learned, the one that clicked, the one that I didn't need to read books about or study. I just got it.
What was the first real program you wrote?
I would probably say the Oberon compiler I wrote in college was my first real program (I was taking Compiler Design). It was limited, and only worked on a subset of the language, but it was real. And it really compiled code. The assignment was to target a virtual machine platform with your basic operations, but my friend and I decided to target the real SPARC processor instead. This actually turned out to be fortuitous because the SPARC architecture included overlapping register windows, so I was able to implement all of the required functionality (we had to be able to compile a certain set of algorithms) without implementing a stack.
Very few things make you feel more like master of the universe than writing your own compiler and having it actually generate machine code for a real machine.
What languages have you used since you started programming?
Yikes. This is a long list, but here goes, in rough order of appearance:
What was your first professional programming gig?
In college I began working for some friends who formed a consulting company. They were working on a couple contracts with a pharmaceutical company and a bank. This was where I had the unfortunate experience of being subjected to Visual Basic. There was also some C work, but all of it was tedium. I quit not too long after joining, ostensibly to start my own company with another friend, doing more interesting stuff.
The first gig I enjoyed, and stayed at, was with a tiny startup in Silicon Valley. My professor at DePaul recommended me to a friend of his, we had one phone interview, and I left Chicago bound for Palo Alto, 2 days after my last class finished, sight unseen, etc. We were building tools to put scientific journals and magazines like Science on the web (yes, the web, in 1994, pre-Netscape).
If you knew then what you know now, would you have started programming?
Certainly. It's in my blood. I would start with different languages if I had it to do over again (well, I would still do C first, but Smalltalk would be soon after).
If there is one thing you learned along the way that you would tell new developers, what would it be?
One? Are you kidding? :) Here's a few things:
What's the most fun you've ever had ... programming?
Usually, whatever I'm doing right now, for any value of now. I've been very fortunate to work on interesting projects that continue to stretch me.
Though, if I had to pick one, handing a live phone call from VoIP to GSM and back with no break in audio was pretty sweet.
Who are you calling out?
I dunno, I'll figure that out later. :)
Posted at 07:26 PM in Code, Experiences, Thoughts | Permalink | Comments (1) | TrackBack (0)




Recent Comments