The whole experience got me thinking about the power of open land, and the effect that the concept has on us. American history in particular is full of the idea that land is there for the taking: just move in and set up shop. Even setting aside moral/ethical questions, that idea hasn't really been operable for over a hundred years, but I think we find it compelling anyway, because land is so inherently desirable to us. Almost like gold, or jewels.
It gets me thinking about how and where people like to live. People love water, and love to live next to water. People love to live near their food. People love to live next to other people. People love to have their own land. People love to have ownership over their space. From an evolutionary point of view, it makes a lot of sense. Games like Minecraft and Dwarf Fortress hit a lot of these notes, and add just enough game to keep us hooked.
In other news, the job is going well. I'm starting to understand how this place works, and I've been able to solve some hard problems, which is always gratifying. But the double stress of job + diet has been wearing me down, and my home life has been suffering. I've basically been a zombie at home, which is kinda bad. I miss working on stuff and I've been feeling a bit hollow. Probably because I basically just play LoL all the time. Breaking the funk is hard. Maybe I should throw a party and make tacos for everyone. :-P
It's at Riot Games, they make League of Legends. LoL, as they call it, is a free-to-play team PvP DotA-style game.
Um look idunno. But they're in Culver City, which is way way closer than my old job. I've been playing the game like crazy for the past few weeks, Annie can attest, and I'm really excited about working there. Riot owns their own IP, they are their own publisher, they're profitable, and they're growing very fast. That is exciting.
I feel like there's a lot to say about changing jobs, but when it comes right down to it, I'm not sure I need to say it. It's stressful, and I'll miss the old people, and I'm nervous and excited about the new thing. So there you have it, in a nutshell. I am definitely looking forward to having an hour of my day back. More to come.
The only way this makes sense is if you imagine we're actually involved in a sort of global half-racial holy war against Islam. From this perspective, it's sort of like some 'good' Germans trying to set up a Beer Garden in Tel Aviv in 1950 or perhaps 1944. To which folks might say, 'Look, we know you guys didn't do the Holocaust yourselves. And maybe you mean well. But it's just not right. Go somewhere else.' And most of us would probably see the logic of that sentiment.
Now, I get it. Quite a few people think this is precisely the point. (Not a lot of TPM readers. But a lot of people. Let's not kid ourselves.) We are engaged in a half-racial holy war against Islam. It's not us versus a series of interconnected terrorist networks which are relatively small but episodically quite lethal. It's us, the white Christians and our Jewish junior partner sidekicks versus the brown Muslim people. (If you're keeping score at home, let's call it the Judeo-Christians -white jerseys- vs. the Muslims -brown jerseys.) So isn't it a bit soon for these Muslims, even if these are some of the good ones, to come over here from wherever they're from in the Middle East and set up shop on Judeo-Christian territory? Particularly where the first battle of the Holy War was fought? Soon? ... heck, the Holy War is still on. As Eric Cantor said a couple days ago, C'mon!
For the record, I do not believe that we should consider ourselves to be in a holy war. I find the controversy over the Mosque to be embarrassing. But considering this point of view is illuminating. It's a good reminder that other people see the world differently.
Regarding my new phone. It does feel like the future. It's not perfect yet, I wish the reader and picasa integration were a bit better. I wish there was a netflix app (I hear there will be someday). But so-far it is strikingly easy to use, and astonishingly capable. I like reading my rss and listening to audiobooks at the gym. The battery life seems sufficient, which was one of my big concerns. They've spent a lot of time and attention sanding down the rough corners of the interface. I can see how this thing wants to integrate itself into my identity. It's offering me a kind of cyborg symbiosis that I find strangely alluring.
-threat needs to scale with players.
-blundering is no fun, or at least it was happening too often.
-balancing the stats was very difficult, nerve seems mad OP, melee weapons were not compelling.
-gear is not yet well understood.
-controlling spawning via line-of-sight can be grossly unfair and forces the humans to do weird counter-intuitive things to maintain sight lines. Which also kinda breaks the story a bit. Perhaps all spawning should be "when an area is revealed" or via "exterior points" (i.e. windows, etc.)
But with all that, the core mechanic seemed fun.
The game needs a thesis. Or, it needs a story. When you sit down to play it there should be a shared expectation of where the game will go. With this game specifically, I wrote it to be a game about the heroes getting inexorably worn down by zombies. So they start strong, but by the end of the map they just barely escape with their lives. But I think the playtesters expected to start weak, and get stronger while facing increasing danger over the course of the map. So, either I need to adjust my perception, or I need to find a way to adjust the perception of the player. It might be possible to do this by calling on various genre tropes in the way the game is described. Or, perhaps my perception is simply out of step.
The game doesn't handle player death very well. We have a cool mechanic where when a stat drops to 0, you're "bitten," you get a +3 bonus on all rolls, but you can't win, and the next hit kills you. But after that there's no way for dead players to participate. If death is permanent, then the maps need to be really short. If death is temporary... then that needs to be designed in somehow. Descent has a concept of "Conquest" that deals with this problem rather neatly, but I don't know if there's a corresponding horror genre trope.
So I know what I need to focus on for the next iteration.
We got a few windows quotes. We picked one. Now I'm trying to give this guy money and he won't show up at our house. Well, no-doubt he will eventually. But I think it's funny how the relationship suddenly changed when we said we were ready to start, and the change is that suddenly he's way too busy.
It's nice to have a fancy meal once in a while.
It's interesting to try to figure out, if I could change how I think, what would I change?
Programmer, program thyself.
After reading slacktivist for a while, I think I've boiled down his essential thesis to this: "self-delusion makes you stupid; intelligence means examining yourself and your beliefs. Anyone can be smarter or stupider by following the corresponding path." Which I think is an incredibly strange and powerful formulation of a thing that people have been saying for a long time, "the unexamined life is not worth living." See also: the scientific method. I'm trying to figure out if I believe it literally, or just allegorically, but he makes some interesting arguments, especially regarding empathy and bearing false witness.
It's really difficult sometimes, for me to keep an open mind in the face of my visceral emotional response. This comes up at work, and when reading the internet, playing a game, etc.. Really anytime. But I value the struggle. Regardless of (or in addition to) simply wanting to think that I'm "being smart" by considering a point of view, I'd also like to (smugly) think that when people, generally, consider other points view, the world is a little bit of a better place for all of us. In other words, when you consider another point of view, you make the world a better place.
It's like planting a (literal) tree. Most of the trees you plant may not grow above 2 inches tall, but if you plant enough, you will have facilitated many grand trees by the time you're old. And that's a pleasant thought, no?*
*damn I need to start planting some trees I guess.
file under: unrelenting smugness.
Actually the best practice I ever had in delegating was my time as work frosh for Interhovse, back in the day. I found that people really need a clear task, that suits their interests and capabilities, and in some cases a lot of support in terms of tools and advice, but given that they will take ownership and really shine. It was such a great experience, being a part of that process, that I chased it all throughout college. The dolphins, the HME, all that good stuff.
Well anyway it's tricky, making a shift now from being a programmer to being a team leader. I'll still be doing a lot of coding, but more and more of my time is probably going to be spent on other people's code, which frankly I am not thrilled about. But on the other hand it means I can tackle bigger problems, which is fantastic. I know that a lot of programmers have trouble making this transition, and I can see why. So I hope I can beat that curve.
And also I might have to buy some nicer shirts. :-/
*I know right? But in a small office, almost nobody ever uses anyone's actual job title. So to announce it would be rather conspicuous and frankly probably not that great for the morale of people who haven't been promoted so, I can see the point. Of course, it's possible that everyone else was already a senior engineer, and I just didn't know it. :-p
A little rough around the edges? sure. Eccentric? hopefully. But fundamentally, no-longer a "young person."
So... I want a smartphone. And thanks to a recent windfall, I can now almost justify getting one. But, I have serious, serious reservations about jumping in to the deep end of the pool in terms of monthly contracts. For reference, with my pay-as-you-go plan from Virgin Mobile, right now I spend $20-30 a month. (I make few calls, I send few text messages, and I don't do twitter.) So if I buy a smartphone that will be a pretty big cost difference.
Anyway I've been researching and waiting. I've come to the conclusion that what I really want -- a pay-as-you-go smartphone -- does not exist, and isn't going to anytime soon. So then, what are my options, and how do they stack up?
|HTC Incredible||HTC EVO||iPhone 4||Google Nexus One unlocked||Google Nexus One|
|Total cost 1 year:||1100||1040||1040||1250||1139|
|Total cost 2 years:||2000||1880||1880||1970||2099|
|Total cost 3 years:||2900||2720||2720||2690||3059|
|what?||very well reviewed||no battery life, too much like a monster truck||too Apple, but.. probably a really good phone.||no contract, but also less support = ??||too much $.|
As you can tell I'm deciding between an Android phone and an iPhone, and my preference is leaning slightly towards the Android, but only slightly.
It turns out they all cost about the same. Especially since, if I'm going to be honest with myself, I can be pretty hard on my devices, and a phone I buy might not last 3, or even 2 years. So there's the replacement/repair cost to be considered as well, and that makes an unlocked phone relatively less attractive.
It's striking to compare the cost of a phone with the cost of, for example, a TV. A television lasts maybe 5-10 years. If it lasts just 5 years, and I spend $700 on it, then my cell phone is more than 6 times as expensive as my TV. (Of course, that doesn't count netflix or cable subscriptions... but it also doesn't count phone overage or apps.)
No decision has been reached. Does anyone have any words of wisdom?
Verizon - HTC Incredible
$200 + $75/mo
($39.99 plan + $29.99 data + $5 text (200 messages))
Sprint HTC EVO
$200 + $70/mo
AT&T - iPhone 4
$200 + $70/mo (down to $60/mo with 200MB data limit... interesting but annoying...)
T-Mobile - Nexus One
$530 + $60/mo
Nexus One Contract
$179 + $80/mo
- implement item revisions
I originally designed my database to represent the "current" state of the system. So my central table, Item, doesn't yet have a concept of "history" or "latest revision." And I don't mind changing it, it's still a young system and very much work in progress, but the question is, what's the right way to represent an item that's been through an arbitrary number of revisions?
The constraints are:
- The solution should be clean (normalized or nearly normalized)
- The solution should be simple to code against
- The solution should be high performance and very scalable
- The solution should be applicable to other tables if/as needed
1. Rebuild it on the fly:
2. Log the old versions:You can keep a "ItemRevisionLog" table, which stores old versions of the items, while the Item table always stores the most up-to-date. The advantage is that you don't have to change the Item table at all, and you keep it from bloating. The disadvantage is that you have two tables with the same columns-- not great design, and if you change one you have to change the other.
3. Add an isLatest flag to your data:You can just keep every version of the Item in the Item table, and use a flag to find the current version. This runs into problems because every Item query now has to do a lot of extra work, and also you need to think very carefully about your primary key. (i.e. when other tables link to an item, they are now linking to many item revisions, not a single row.) Still, it's not unworkable. Just a little ugly.
4. Treat revisions as first-class data, and normalize them:Make a table called ItemRevision, and put into it everything about an item that you want to be able to revise, and add a couple of columns for date, editor, and item_id. Then take those columns out of Item, and instead give it an ItemRevision reference called "latestRevision." Each revision is now available when needed, and that data is only written once. Retrieval is also a simple join by id. The downside is you have to be very explicit about what is revisable, and you have to change your data design every time you change your mind about what can be revised (e.g. right now).
So I'm going to cut to the chase. Number 4 is really the right answer, it seems. Anyway that's what wikipedia does, and their capacity for revision management is [unquestioned? unassailable? practically idiomatic?]. Also I found this great chart of the wikipedia schema, which, if you're into that kind of thing, is pretty cool. It's pretty clean, for all the work it does. Color me impressed.
You can see how they handle page revisions right in the middle of the graph. The Page table points to a Latest Revision, while each Revision table points to Page. A separate Text table stores the actual page text, for reasons that are not immediately clear to me, but that I will assume don't really apply to my much smaller and simpler system. In any case the chart, working in combination with a good night's sleep, has convinced me.
This has been a fun puzzle for me, and once I stop grumbling about rewriting my Item data access to go through a "revision" object, it will make me a better person.
It's the best!
I filled up all 24 keys. Only 3 with single-keystroke keys (tab, enter, delete), the rest with all kinds of wacky keyboard shortcuts.
I'm pretty happy with it. I might buy another one for home if I start uh... using my computer more.
But as I keep pushing forward anyway, it seems to me that my central problem has been that I don't even understand where the work happens. Where's the beef, as it were.
A game, for example, is written in one programming language, and is tightly bound to itself, and to a single machine. It's easy, in principle, to follow the path of execution from user input, to simulation, to display. And in between there's a mass of c++ or what-have-you that makes everything go. To me, that makes sense.
But on the web, I face a daunting situation. The user sits on machine A, in browser B, makes a request to server C, which hits database D, and when the server gets the data, it renders a page, and returns it to the client. The browser then renders the page, and then the client side code takes over and manages some of the interaction going forward, talking to the server as necessary.
Just to take one example, count the number of languages, or distinct syntaxes, involved in this chain of events:
- URI/URL, (HTTP)
- XML (webservices, optional)
- Flash (optional, special purpose)
So, as a newcomer to the field I say, great, where do I put my application? Where does the code go? And the sad answer is, it has to go everywhere. In order to make a high performance site (the only kind I can even bear to contemplate), you need spend time with each of these technologies and syntaxes. The connections between most of the different languages are very loose. There aren't a lot of good tools for looking at more than one or three of the languages at a time. And they all matter.
So my essential personal problem with web development, is that I find it absolutely disgusting. It literally triggers my "unclean" emotional response. And then I shut my brain off and try to hold my nose as I program, and it's not very easy to work one-handed.
Well anyway I have these websites that I want to build. So, I need to get over it. I need to get over my tightly-bound, completely-integrated elitism. And so part of what I've been learning lately, is that I've been looking at the stack in the wrong way.
Now that I've figured out that nobody designs websites in html and css (they design in photoshop or illustrator), things are starting to make a lot more sense. I can redraw my big list like this:
how does it look?
4. ASP (optional)
what does it do?
4. URI/URL, (HTTP)
how does it feel?
2. XML (webservices, optional)
3. Flash (optional, special purpose)
Do not, under any circumstances, try to design your page layout with C#. That sort of procedural art is technically possible, but it's incredibly time consuming, and the tools for it are terrible or nonexistent.
I know this isn't novel, but I feel so much better for writing it down.
*I'll use the ASP.NET C# stack because that's what I've been using for my personal projects. I strongly suspect that it's not much better or worse than anything else. I know I personally like it better than Ruby on Rails. I've never really tried PHP.
I think that as our society gets richer, we see more and more of these single-purpose items in our daily lives. They're not really very economically efficient unless you use them pretty often, but I know that I have an emotional weak spot for the perfect tool, the tool that makes one particular job really easy. And I'm finding, as I look around, that more often than not the right tool is out there*.
I think the same trend is true across all manufactured items, across all sectors of industry and commerce. In an abundant ecosystem, the drive towards specialization is strong. You see the same thing in rain forests, where many species specialize on eating just a few things, and you see the opposite in tough or turbid environments like cities and deserts, where a few animal species survive by being generalists. If you only have a $20 budget for your kitchen supplies, you're not going to blow it on a salad spinner. But if you already have plenty of bowls, it starts to look pretty useful.
I'm not sure if I think this kind of specialization is good or bad. I find it pretty easy to make arguments either way. Certainly I think people can take it too far, in what they choose to acquire. But I don't think I'd blame the tool for that, I'd blame the collector, if they clutter up their house or blow their budget. It's not the pipe wrench's fault that you're not a plumber.
Anyway, I like to have an awareness what tools I choose and why, and this has been on my mind a lot lately as I try to clean and organize the house, and yes, as I ponder new acquisitions. ;-)
*Funnily enough, I think this is part of the reason I get so angry about software that doesn't suit my needs; I've grown used to the idea that if I need an egg scrambler, I can order one from the home shopping channel. But when I want the perfect keyboard or IDE, I'm left in the cold. Maybe my expectations are unrealistically high? Or maybe the software industry is still young when compared to say, manufacturing, or kitchen ware...
But I think if you press most people, we do believe that some habits are better than others. Some beliefs, when held by society at large, make people happier or more productive. Some bits of culture are economically more effective than other, at the very least. Science, vaccination, germ theory, etc.. But then again, whether you believe in the flying spaghetti monster or not is unlikely to make much of an economic difference, right?
To each his (or her) own. People are different, and if we accept that some people are sprinters and some are distance runners, some are poets and some are boxers, that's a form of relativism that has real positive social impact: specialization is economically fantastic. So at some point we're willing to grant our neighbors a degree of latitude in their actions and beliefs.
But on the other hand, consider motivation theory -- what motivates people? What would society look like if everyone was aware of how to get the best out of themselves, and out of others? I for one think it would be a better place. Part of the (unspoken) contract of the Enlightenment, of Science, is that as we answer more of these questions, we are driving closer and closer to a true utopia, to the capability to optimize society, to a place where everyone is happy and productive, where both the individual and the society are stable and resilient.
Fundamentalists reject this contract implicitly, and argue that their teachings, not the scientific method, hold the path to the ideal society. The vast majority of religious people aren't true fundamentalists though... the conflict between religion and science is for the most part a construct of the fundamentalists. Many religious scientists are put in a hard spot, because their science demands that they denounce fundamentalism, but their religion may flirt with it or even embrace it wholesale. How can I explain objecting to a specific, inflexible belief, while not objecting to a specific, inflexible faith? Awkward.
This is where most modern people hold up the white flag. We use cultural relativism as a social lubricant, to allow different people to interact without getting all worked up. It's a necessary (by definition) part of a multicultural society.
But I guess I think it's important to keep in the back of your mind the thought that there might be a real, meaningful difference between two beliefs. And that the belief you hold now, might not be the right one.
...relativism: pretty good, in moderation!
After talking to Annie I figured out why this is. Nobody actually uses html editors in this way, to do first-pass design. That's what photoshop is for. I've been driving backwards. Once I sat down and started sketching out my interfaces in flash (where I'm comfortable drawing boxes, etc.) I started making real progress towards my actual design goals.
When I got the thing looking pretty good in flash, it was actually pretty easy to translate it into html/css using any reasonably competent html editor. The one I'll probably stick with is the one that's included in Microsoft Visual Web Developer Express, since that's where I'm working on the nuts and bolts of the site itself.
In conclusion, every html editor sucks, but they suck less if you know exactly what you want to build before you sit down to wrangle divs.
A fully programmable, relegendable* 24 key keypad that will sit just to the left of my keyboard. Simple, practical. Not a gaming keypad, though I looked at a couple of those too. I just think I would feel silly using one while programming. Anyway, I have big plans for this guy. I'll write about it when I get it up and running.
*Nice made up word, eh?
1. I don't like confirming everything twice. I'll turn off browser-open-file confirm boxes.
2. using the windows key to open programs is awesome.
3. yay search
4. using a third party zip utility to install things directly into the program files directory fails because they don't have access. The two I tried (winRar and 7Zip) did not handle it well.
5. It's pretty.
6. setting environment variables hasn't changes since what, windows 98? It still sucks hard. I know nobody ever actually does this... except anyone using java or maven. Grr.
But I can't escape the vague feeling that Microsoft have given up. It seems like their heart really isn't in it anymore, like they're just doing what the broader IT and design communities tell them to do. This is an operating designed by a company that's staring its death sentence in the face. They can feel themselves becoming IBM, and the irony is not lost on anyone. Windows 7 is a deer-in-the-headlights, avoid-all-controversy design. And it... well so far I find it vaguely depressing.
*Yes yes, nobody cares what I think.
What's the difference between building a truck (a big 18-wheeler), and building a racecar? They have a lot in common. They both have very powerful engines. They both meet very exacting quality standards. They're both very complicated. But there's a different mindset that goes into each one. Let me table you:
|speed and handling||not important||vitally important|
|weight and aerodynamics||not important||very important|
|reliability target||months, years||one race|
|maintenance costs||must be cheap to fix||not important|
|fuel efficiency||very important||not important*|
You see a lot of trucks on the road. Building trucks is serious business for serious people. People who build trucks can be proud of what they're doing. But you'd rather drive the racecar. (Or at least a sports car.)
So, I'd like to apply the analogy to something closer to my field of interest, namely browser-based MMOs. When you're making such a beast, you have a choice. You can look at it like a web application (see: facebook, amazon, gmail...) or you can look at it like a game (see: mario, halo, starcraft).
My contention is simple: web-apps are the trucks of programming, games are the racecars.
|interface speed and handling||not very important**||vitally important|
|cpu efficiency and network latency||not important||very important|
|user accessibility, availability||99.99 or better||95? 90?***|
|maintenance costs||must be cheap to fix||not important|
|bandwidth costs||important||not important|
I think you can take this analogy a lot further, to look at the people who work on cars and programs, to look at their tools and trends, etc.. Anyway it upsets me that we're building a racecar, but our engineering decisions seem to follow the current truck-building trends and best-practices. They're not appropriate to our business and they've put us in a world of hurt.
*This is a guess. Maybe fuel efficiency is important for racecars? I don't really know.
**web page response times of 1 second are acceptable. If you press a button in a game and don't see a response within 0.5 seconds, the game has crashed.
***World of Warcraft goes down for 6 hours every week, on Tuesday morning from 5AM to 11AM. If KFPW went down for a (scheduled!) 2.4 hours every day and was fine the rest of time, that would be just fine with me. But can you imagine if gmail did the same thing?
Yesterday and today I finally sat down to work on a little project for Tim, and I find myself really invigorated by it. Programming for myself, by myself, on a new project, is a completely different experience from working on a huge MMO codebase. I don't have to worry about the side effects of my changes because there are no other systems relying on this code. I don't have to get into anybody else's head, and I don't have to reformat code to make it readable. I don't have to remember/wonder why something was done a certain/dumb way.
I control the horizontal, I control the vertical. I go from being the "veteran," to being the "guru."* My code is much simpler and less defensive. Which means, much faster to write. All the class and variable names are perfect. It is so refreshing. I know it won't last. but it's nice.
* Funny. http://coderoom.wordpress.com/2010/03/19/5-stages-of-programmer-incompetence/ Thanks Jared.
I just came off of an excellent discussion with Dave, and I want to reflect on it and flesh out my thinking.
When people are living in conditions of existential stress, (wars, famines, pre-technological societies), (my) conventional wisdom says that social pressures increase. Stressful times create intense personal bonding, and with that bonding comes strong social pressure to conform to the group.
There's a point I want to make here, that I'm struggling with...
Remember when calculators were introduced to schools? A lot of people who grew up without them said, "[That's cheating! Children will never learn how to do arithmetic by hand! They will grow up stupid!]" And well they were right about the second sentence, but wrong about the first and third. The fallacy that they fell into, is that their experience tells them that you will live most of your life without access to a calculator. But their experience is completely inapplicable to their children's lives. Kids growing up today will always, always, have access to calculators, and google, and wikipedia. For the rest of their lives, forever and ever. So, why would they need to know long division? It's a cute trick, and it's good to know what it means to divide two numbers. But you're never going to use that skill as an adult, except to teach it to your kids, who will also hate it.
So: calculators are not cheating, they are the future. Looking up facts online is not cheating. Storing all of your friends contact information into your devices so that you don't have to remember their phone number is not cheating. Using a GPS navigation system is not cheating.
Morality is having the same culture shock.
Example one is sexual promiscuity. 200 years ago, it was a big deal, because it caused all sorts of very real social problems in the form of unwanted pregnancies, orphaned and abandoned children and mothers, and disease. Today, (almost?) all of those problems can very simply and easily be avoided. The consequences of divorce are down too; divorced mothers are no longer helpless and hopeless. It still sucks of course. But it's not the moral hazard that it used to be, by a long shot.
So... that's all really great news for society, that we don't have these horrible problems anymore. But when some people's behavior starts expanding to fill the new environment, other people get really upset. "[That's immoral! People will start having sex any time they feel like it! Society will fall apart!]"
I'm going to come short of finishing the analogy I've drawn here, because I'm too uncomfortable with the topic myself. But I think it's clear where this argument is going. If resurrection were cheap and easy, murder would not be nearly so serious a crime. Nor would suicide. We would still want to find it abhorrent, but it wouldn't threaten society to the same degree. You'd have recreational suicide, ritualistic sacrifice, lethal game shows. And it wouldn't ruin society at all.
So, perhaps, the more advanced, the wealthier society gets, the more depraved it becomes, in the eyes of the older society. But also, the more liberated it becomes? Like I said, I feel pretty uncomfortable with this discussion, or at least, with having this discussion in public, outside of my own brain-space. Taboos are powerful things. But I wanted to get the point out.
No-one makes a usb theremin? or do they? I don't know if MIDI would handle a theremin very well...
blech. None of those is what I want.
I'm feeling very Veruca Salt about theremins all of a sudden
At first glance it looks really, really hard. With a traditional (static) web comic it's pretty easy to put a number on how long it takes to produce each update. An hour to brainstorm the joke, an hour to sketch it out and complete the planning, and maybe a few hours to implement.
With a micro-episodic game, your players are supposed to come back every other day and play a little bit more, right? Is it possible to develop fun/deep gameplay, without driving away your audience? The average web comic audience, after all, only needs about 10 seconds to grok your latest update; value is delivered over a span of weeks, or during long binges as a new reader plows through the archives. Your game needs to stand up to both modes of play.
With a traditional game, value is delivered primarily through the novelty of the gameplay or the puzzle.
Comics tend to be character driven, and a good comic can coast for a while with no plot at all if the audience is invested in the characters. A game would need to capture that level of good-will. People need to want to come back each time to see what happens next.
Assuming you can solve that problem, you immediately hit another problem. In a comic, if a reader doesn't get or like a particular panel, they can skip it. A micro-episodic game would need to be very careful to not throw up any roadblocks for players. If players can get stuck and become frustrated, you have no audience.
In order for the game to be meaningful, there have to be choices. But in order for the micro-episodic format to function, each update has to be applicable to every player, regardless of their previous choices.
Web comics are not very bug-prone. A micro-episodic game certainly sounds very bug-prone. The game design and tech design would need to be very defensive and robust.
So. Like I said it looks really really hard.
Perhaps obviously, I'm looking at things like homestarrunner.com and mspaintadventures.com for comparison and inspiration. Those two sites are very successful at delivering many semi-interactive experiences on a regular schedule. Are there others I'm unaware of? Actually, I'm not sure I want to know. I like to jump into things like this without doing a lot of research first, because research tends to be depressing. ;-)
The game that's taking shape starts off very, very simply. It uses a character that grows as you make choices, in response to your choices, and you grow your character over the entire span of the game. The essential mechanic is navigation, you have to navigate to the next screen. Maybe the front edge of the game is always a "loading" screen which means that you're at latest. Probably you can navigate backwards and reverse (some of?) your choices to explore other options. There's a "reference" save game that anyone can use to jump into the game at the latest point. Maybe it's pulled from the community, maybe not. Or maybe that's not necessary, or maybe only at the start of chapters. We progress from blank screens to mazes to simple choices to character development, and as we go we introduce game mechanics that will stick around for the rest of the game.
* navigation from late in the game back to early screens
* massively multiplayer
* time travel, revisiting old locations
* community driven content generation
* algorithmic/interactive content generation
Sounds fun. And still really really hard.
Ok another inside baseball post for all those flash/java coders in my blog readership*. So, you say you need to pass objects back and forth between Java and AS3. You say you've tried using Xstream XML serialization, but it's just too slow? Let me tell you, you definitely want to be using AMF. It's Adobe's native object transfer format, and it is wicked fast**.
Ok so that means you want to use BlazeDS on the java side, and some kind of native deserializer*** on the client side. That sounds pretty simple! But since I know you're a vry srs software engineer, I know that you need your objects to be strongly typed and type-safe, so that you can plug them into the rest of your client and server logic. Well, to do that you need to carefully line up all of your classes on the java side and the flash side so that they are the same, and then register each AS3 class with a call to registerClassAlias. Ok still not so bad.
Next, forget about using AS3 enums. The AMF deserializer basically won't let you do it, and you'll lose the benefit of having an enum class to begin with. You can squirm and complain, but you're not getting out of this one: Java enums work fine. AS3 enums do not work. You must use primitive strings. You will lose enum type checking and compile time safety. DEAL.
Now, you're pretty close, but there are a couple more things to take note of. If you're working in vanilla actionscript 3, you don't have the mx packages linked in. That means that when BlazeDS sees a Java List, and it sends you something called an ArrayCollection, flash will barf. So you need to set the legacyCollection flag on the SerializationContext object before you serialize your java objects.
**about 40 times faster than our (admittedly unoptimized) as3 implementation of xstream. 40 times is a lot of times to be faster by.
***pronounced de-cereal-izer, which is also a great word. I think that's what you call someone who eats all the crumbs at the bottom of the 3 nearly-empty cereal boxes in the pantry.
When you first start a project, it acts like math. You write down a few formulas to transform your data, and you pass stuff back and forth between your various functions. But as the project expands, somewhere along the way it stops acting like math. You start to bump up against the limits of what you can hold in your head, and then you blow right past those limits. And even though your math skills are still relevant for looking at any one particular small part of the puzzle, it turns out you need a different approach when you're worried about hundreds of thousands of lines of code.
The analogy that strikes me most is biology (think of cellular biology). When you're facing certain classes of bugs in systems "of a certain size," the empirical approach just makes more sense. At some point it doesn't matter what you think the system should be doing, you need to actually test it to see how it performs. As you add modules and dependencies, you're relying on a dozen or a hundred or a thousand other developers, and their bugs are now yours. This is the point at which you say something like, "lets try changing the data and see if that solves our problem."
To a computer scientist, that sounds like defeat, surrender, or worse, a lack of rigor. But in my experience at least, the math approach falls on its face after a certain level of complexity. Just as it's impossible to solve even moderately complicated general mathematical equations, programs above a certain size defy clean theoretical solutions. The biological approach however, becomes more and more effective, in comparison.
I'm not trying to give advice here, more just making an observation. Maybe we should be teaching people about the skills they need to manage software that has grown its own eco system, that has its own biology. Or maybe that's what the IT department has been doing all this time, and I only just realized it.
*Computer Science is what professors call programming. Never tell a professor that you're a programmer. You should be a software engineer at the very least.
This is an incredibly beautiful idea about choral music, participation, and the internet. The video is kindof hokey, and the sound needs a little bit more fine tuning, especially the aspirations, but holy crap it sounds fantastic. Wow.
This bit of news about this country's major financial institutions snuck under the radar, what with health care reform and all. Perhaps we're going to do something about those too-big-to-fail firms, after all? I had almost given up on that one.
This is why you're fat? Well I find it remarkable that this study has never been done before. I have a suspicion that it's going to be very very important.
But probably not as important as this. Printing organs, or skin, or... missing limbs... Ok! Welcome to StarTrek level medicine. Not quite. But if this technology scales is capability, and if it scales in economy, it could simply remove the need to find donors for transplants. Which means vastly reducing the cost, uncertainty, and complexity of transplant operations. Which means that transplanting becomes a viable treatment for a much greater number of conditions. And while you're regrowing that organ, lets do some gene therapy on the stem cells first. Let's cure the aging diseases as we replace your failing organs one by one. Cheap. Scalable. No need to grow secret armies of organ donor clones in vats. Whole science fiction distopias avoided by one device.
On top of the stuff mentioned in the previous post... what a week. If news was like this more often, I might pay more attention.
The US Congress passes a Health Care Reform bill.
And suddenly I feel... represented. As if major players on the world stage back my positions. I mean that feels pretty good I guess.
Now, you can argue back and forth whether it's really in the Chinese people's interest to lose Google*, and you can argue back and forth over whether the health care bill is even a net positive for the American people**. But regardless, many skeptics have been silenced in the past (2?) days. I think it's a remarkable reminder of how powerful ideas can be.
*Their arrival was good for China, and the manner of their exit will be good as well, because it makes clear that the government forced them out. Whether in the years to come, their absence outweighs the light they shone, is to be seen.
**Getting rid of denial of coverage for preexisting conditions, alone, goes a LONG way towards a more humane health care system. I am willing to hold my nose for some of the other crap in there.
I want to embellish that statement. I've never really thought of myself as a happy person. I think temperamentally I'm on the sadder side. But when I take my internal temperature these days, it comes back much happier than I might expect. Than I'm used to.
A lot of is definitely the fault of the person I spend most of my non-working time with. ( <3 )
I think there are other factors too. I'm regaining a lot of the confidence that I possessed when I entered Caltech. Almost all of my deep doubts have vanished. I mostly know who I am, and I'm reasonably happy with that person.
I have to get back to work now (ha!) but I expect that some more deep thinking will show up in the near future.
I would just like to restate some of my principles now.
* Tool performance and stability is important.
* Iteration time is important.
* A good error message can save an hour of time.
Which is to say, if you pay someone $40 an hour, you should buy them a $400 tool if it saves them 10 hours of time over it's lifetime.
We talked to Jim, and we told him that we were eventually interested in setting up aquaponics, but that we were basically new to fish, and wanted to start small and easy. Jim was incredibly helpful. He sold us a nice glass tank and an integrated unit that sits on top of it and does light and pump and filter, plus a heater. We sold ourselves some gravel and clay and plants and a rock. We took it all home and set it up, and filled it up with water, and put in the water conditioner. You have to do that to get the fluoridation out.
Then in the afternoon we returned for the fishes. Jim told us that he had been working 15 days in a row, because his daughter had just had a baby, so she couldn't come in to work. I sympathized. We picked up 2 pairs of 2 varieties of platies, and took 'em home, and after letting the temperature adjust and all that, we set them loose in their new home. Then we stood there and watched them for like 20 minutes.
It's a 12 gallon tank and it can hold a lot more than 4 little guys, but we wanted to start small and move up from there. Eventually we'll get to the goldfish, and then maybe koi, when and if we go for an outdoor pond system. But for now our little tank will be plenty. And I think Annie's already coming around to the idea ;-)
I mean, one one side you have embedded systems, and then you have mobile devices, and then you have game consoles, and desktop, and then you have expert system, and then server, and then web... And they all have massively different constraints. That's what you don't get if you follow the software development trends. Most of the software development technologies out there were invented to solve very specific problems, but their evangelists are unwilling to admit it. So it's difficult to tell which buzzwords and trends fit your problem.
On the one hand this is all just basic design: list your requirements and your constraints at the beginning, and then pick solutions that fit. I guess what I object to, is that a lot of technology evangelists would really like you to skip the step where you pick solutions. As a marketer, if you can turn technology selection into a religious war, then you don't have to worry about your faithful jumping ship if their problem definition changes.
So, I'd love to see a map of the various axes of software development, along with which technologies, methodologies, etc., were designed for which region. And then I will print it out and roll it up and hit people over the head with it whenever they tell me that I should be using Ruby on Rails.
Every so often Eclipse seems to decide that you're being too productive. It'll crash, then refuse to launch. Generally to get it up again you have to lobotomize it first, and then rebuild your workspace. This usually takes at least an hour out of my day every time it happens. It happens about once a month, I'd say.
I read the book, and I found it disturbing and yet irresistibly fascinating. I like to think that I have a natural skepticism for people who tell me that my political enemies are dangerous people. I really don't like that idea, it smells like racism and fear-mongering. So I continue to find this book hard to integrate, inasmuch as it casts a shadow on a lot of people.
However I think it also offers pretty compelling window into the psychology of some large political movements, in the United States and elsewhere. Consider whether you agree with this statement: "Once our government leaders and the authorities condemn the dangerous elements in our society, it will be the duty of every patriotic citizen to help stomp out the rot that is poisoning our country from within." A lot of people do agree with that statement.
What's presented in the book is a collection of academic research on authoritarian personalities that, as far as I can tell, seems legitimate and makes sense. It's an easy read. The author does have a political axe to grind, and he's up-front about that. (It didn't bother me because I basically agree with him politically.) It addresses topics like hypocrisy, mental compartmentalization, leader and follower personalities, and religious fundamentalism, and along the way it paints a picture of the people who love and follow public figures such as Sarah Palin, Lou Dobbs, and Glenn Beck.
Like I said. This book makes me really uncomfortable because it tells me that my political enemies are dangerous, irrational people. What I'm trying to do with it is, instead of closing myself off further, to try to open myself up. If I can figure out a way to use this research to understand the emotions and beliefs that drive this certain kind of thought, then maybe I can communicate better.
Sam turned me on to a blog called slacktivist, which seems to spend most of its time ranting against right wing authoritarians, taking their arguments apart, and generally trying to get inside their heads. It's a really clever and insightful blog, but as much as I might enjoy it, slacktivist is a terrible tool for convincing your uncle that he needs to lighten up on the gays, for example. I think that by understanding the basic underpinnings of the RWA personality, we can do better.
Recognize that your uncle sees the world as a dangerous place, full of moral and physical peril. Recognize that your uncle believes that his culture, his very way of life, is under attack by coordinated, godless enemies. Recognize that he longs for a strong leader to tell him what to believe so that he can help defend his tribe. Then reconsider whether you want to get into that argument with him.
Anyway if you find any of this interesting, I think you should take a look at the book I linked at the top. I'd love to talk about it with some people.
Abstraction and optimization act as opposing forces in software design. Optimization is always trying to push your algorithm closer to the metal, closer to the silicon. Optimization rejoices at side effects and arcane trickery. Abstraction is trying to push your algorithm away from the silicon. The mindset of abstraction is to make sure you never have to worry about those messy details. Abstraction rejoices at eliminating your algorithm completely by delegating it to a lower level. So abstraction allows a large group of developers to work on a vast project without slowing eachother down. Optimization on the other hand, allows code to run fast enough to be useful.
For academic applications, abstraction is more important. (If your code is slow you just come back in the morning.) So, that's why they teach you abstraction in school.* But for games, optimization is king. Generally, the optimization mind-set is not taught. You have to seek it out, you have to believe in it.
My belief, as a games programmer, is that abstraction is only permissible as long as it doesn't get in the way of necessary optimization. I currently am in the middle of a battle with a culture that seems to believe in abstraction as an inherent good, as a higher order value than optimization. I find that frustrating.
*There are lots of good reasons to teach abstraction, it's a difficult and important skill and it can color the way you think for the rest of your life. Optimization on the other hand is by nature tied to the specific technology that you're working with, it's far less generally applicable and it tends to be full of tricks, instead of full of insight.
Luckily we're not in the position that our financial solvency depends on getting the rent money, but boy it sure would help. So I have to worry about whether the price is too high, whether the ad is right, whether I could be doing more to get it out there. And whether the tenants will give me troubles when I finally find them. There's a lot of uncertainty about the whole thing, and I'm trying to keep a lid on it so it doesn't bubble over.
I think it's going to be well worth it when we do get someone in there, but it sure is nervous-making in the mean time.
We're setting up a fortnightly game, so let me know if you want in and I'll add you to the spam list.