Undersized development team – Are you in one?

Are you in a software development team with less than ten members? Less than five members? Just three, including you?

In a small sized team, priorities and responsibilities may start getting mixed up, where each member can generally take the place of another. This is fine, and there’s an additional condition. Each member must also be extremely well-versed in an area of the team’s responsibilities.

For example, in a team of three, one member (usually the team leader) takes on documentation, business logic and the overall big picture. One member takes on the back end process flow, making sure the backbone of the project is running smoothly. And the last member takes on the front end application design.

Why is this segregation important? Let me contrast this with a larger sized team first. With more people, a task may be assigned to several people, and the collective knowledge of this group is used to solve the task. Any team member can also more or less take on roles and responsibilities of another team member in this smaller group.

As the team size gets smaller, this collective knowledge and role flexibility shrinks. When you’re dealing with a small team, every member counts. Each member has to be an expert in their own circle of responsibility, or the effectiveness of the team suffers. Treating each member in this situation like a plug-and-play component is a disaster waiting to happen.

So how can you help yourself? Learn to say no. Multitasking with other team members’ responsibilities is the fastest way to drain your energy and compromise your own output quality. In the event that you have to take on another person’s tasks (say the person’s on leave), then prioritise. Find the tasks that helps the team most, and then do those, even if they aren’t originally your responsibility. This way, the team moves forward, the project gets closer to completion, and the users are happier with the support.

If you can, get good help. Even one or two more team members can help the overall effectiveness of the team (try these for some hiring arguments). This is different from adding people to projects to make them go faster. What you want the additional members to do is alleviate some of the independent tasks off the existing members. Then slowly spread out tasks more evenly amongst the team members.

Back to Basics – Sierpinski Triangle

I remember back when I was first learning C, and one of the assignments was to draw the Sierpinski Triangle. I didn’t know what it was, but sequential steps were given to iteratively create it. The steps were roughly like so:

  • Generate a triangle on a plane with 3 points
  • Set the centre of the triangle as the current point
  • Randomly select one of the triangle points
  • Get the mid-point between the current point and the selected point
  • Plot the mid-point and set it as the current point
  • Randomly select one of the triangle points
  • Get the mid-point between the current point and the selected point
  • Plot the mid-point and set it as the current point
  • Continue till iteration limit is reached

I was told to visualise the plane as a matrix, and the plotted points were to be printed as asterisks on the screen.

It’s been years now, and I still think the screen output of my Sierpinski Triangle sucked because of the low resolution. Now, older and wiser, I can come up with a better representation.
Sierpinski Triangle

Download the full source code.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace b2bSierpinskiTriangle
{
    class Program
    {
        static void Main(string[] args)
        {
            const int cnSize = 512;
            const int cnLimit = 50000;
            int[,] points = new int[3, 2];
            points[0, 0] = cnSize / 2;
            points[0, 1] = 10;
            points[1, 0] = 10;
            points[1, 1] = cnSize - 16;
            points[2, 0] = cnSize - 16;
            points[2, 1] = cnSize - 16;
            Bitmap bm = new Bitmap(cnSize, cnSize);
            Graphics g = Graphics.FromImage(bm);
            g.FillRectangle(Brushes.White, 0, 0, cnSize, cnSize);
            int trianglepoint = 0;
            Random rand = new Random();
            int currentx = 0, currenty = 0;
            int previousx = cnSize / 2, previousy = cnSize / 2;
            for (int i = 0; i < cnLimit; ++i)
            {
                trianglepoint = rand.Next(3);
                currentx = (points[trianglepoint, 0] + previousx) / 2;
                currenty = (points[trianglepoint, 1] + previousy) / 2;
                bm.SetPixel(currentx, currenty, Color.Navy);
                previousx = currentx;
                previousy = currenty;
            }
            bm.Save("sierpinski.bmp");
            g.Dispose();
            bm.Dispose();
        }
    }
}

Short and sweet. Instead of printing to the command line screen, I plotted the points to a bitmap. I still remember printing my program listing and the Sierpinski asterisks output. Though pleased with the required output, I thought it looked a little unrefined around the edges.

Printing to a bitmap at pixel level makes it look much better…

Path of a Polymath Programmer Part 5

I’ve talked about how stories, typing, role playing, console games and self-learning Japanese so far. Quick links here for reference:

Continuing the console game part, I started noticing more about the games than actually playing them. I marvelled at the graphics (it was mostly pixel art then), and appreciated the game music. Immersed in the story plots, I identified with the characters (I still have sniffles when I think of Celeste losing her grandpa in Final Fantasy VI) and got lost in the fantastic worlds the game creators forged.

I was in the Chinese orchestra then, so I had begun learning about music. It was at this point that I found I could separate distinct music pieces in the same song played by different instruments in my mind! There’s the main melody, the supporting melody, and the bass or beat carrying the song through.

Fast forwarding… got drafted into military service. Learned to harden will and tons of self discipline and self reliance. Fast forwarding…

University life!! I would eventually major in applied math and computational science. What’s the difference between computer science and computational science? You can read the short description here. You will also notice that a lot of my sample program source or topics tend to focus on math and science related stuff.

With university life came a lot more freedom in how I use my time. I watched tons of television shows. Ed. Friends. Gilmore Girls. Ally McBeal. Charmed. CSI. Andromeda. Alias. Sliders. I also watched tons of movies (my friends usually find out about the latest movies from me). Lots of stories and plot lines. Improved listening skills and English language (I’m in Singapore, and sometimes the English spoken here leaves a lot to be desired…).

Also with university life, I needed a computer. So finally, I got a proper computer so I could print notes and reports, and do some light programming. If you’re doing C/C++ programming on the Windows platform, I suggest the Dev-C++ software. I was writing code on the *nix platform, but sometimes I needed to test my code without going to the university labs.

Then I started mucking around with computer graphics software. There’s Terragen™ for generating incredible landscapes, Bryce 4 (version 6 as of this writing) for creating quick scenes and texture generation, and trueSpace 4 (version 7.5 out as of this writing) for object modelling. I used the different software for the function it provides best, then export the results to another software for the purpose I need. For example, I could model something in trueSpace, export it into Bryce, and render the object there with a texture I created. Or I could

  • render scene in Terragen and export as picture (resource 1)
  • create texture in Bryce and export as picture (resource 2)
  • import resource 1 and 2 into trueSpace
  • map resource 1 onto cylinder and place on scene to use as backdrop
  • map resource 2 onto an object modelled in trueSpace
  • render entire scene in trueSpace

Learn to use the tool that is most efficient at what it does. More importantly, learn to use the results from that tool with other tools.

Then I learned about Hyper Text Markup Language (HTML) and Cascading Style Sheets (CSS), and played with the code. It looks very nice and all, but it’s only on my computer. The web was all the craze then, so I thought I might as well get a place to put my brand new spanking HTML page up, so I searched around for web hosts. I went for free hosting for a while, but eventually got a paid package. I was still a student then, so this cut me back quite a bit.

Sometime around this period, I was taking computer graphics and 3D geometry classes. One of the professors mentioned a computer graphics contest, and the deadline was only a few days away. I don’t know what came into me, but I spent the next few days coming up with a theme and the scene. My weekend was burnt because I was busy scanning textures. I worked through the night before the deadline because I was slapping on textures and tweaking the radiosity settings and rendering and rerendering the scene.

It was terrible. I don’t think my submission even got noticed. The other entries were way better looking than mine. But I thought I had a better theme. All those days and nights gone… oh well, at least I tried.

Time passed and suddenly I was in my final year. The thesis topics available weren’t interesting, so I talked with my advisor and finally came up with something. I would be doing a study on computer virus epidemiology. Ok, big word there. Simply put, I’d be studying how computer viruses behave during an epidemic, and I’ll be using existing information on biological viruses as a comparison.

So amidst the graph theory, coding theory and Frenet apparatus from my math classes, and more matrix calculations than I ever want to see in my computational science classes, I was busy researching on both biological and computer viruses. I had to understand the math models used in epidemiology so I could transfer the relevant properties over to my simulation program.

Oh, I didn’t tell you. I was writing a computer virus behaviour simulation program that mimics real world results. And no, it’s not a computer virus. I was interested in its behaviour, not its method of spreading (though I got bombarded with information on payload and security and what-not during my research).

Then my ability to use tools and interchange results was put to the test. I wrote my simulation program in C and ran it in Unix. But I didn’t know how to produce a graph or chart with my results. Then I remembered Matlab, so I changed my C program to output something Matlab could take in. Then I used Matlab to generate the chart.

I was using LaTeX to generate my thesis document, and I had had to write small programs to generate code for some LaTeX commands. I also imported the Matlab generated charts into my thesis document. I remember one of my fellow students being kind of smug about his knowledge of document generation, because he co-wrote a few papers with his professor. Oh well…

In the end, I wrote a 40-page thesis, complete with research findings, charts, math formulas, proofs, topological models and my proposed model and program for computer viruses. That fellow student was kind of smug about his 100+ pages of material. Whatever

Next came the thesis dissertation. I figured that my presentation would have more impact if I could show the computer virus propagation. I needed a Windows port of my simulation code. Oh my goodness! Luckily, I tinkered with Windows code before, so I dug up the remnants of a working template, and translated my C program simulation logic into the Windows code equivalent. My original simulation program had no interface to speak of (it was supposed to just run for hours and blip out a bunch of numbers), so I had some work to do. I also had to display the viral propagation in real time, so I had to code in some basic charting function.

I got the Windows program up in time, and all in all, the dissertation went well. Whew…

So… a preview for the next one in this series, I’ll be talking about game development and demos. Keep coding!

Continue to part 6

Pitfalls of a polymath programmer

I’ve talked about how a polymath programmer can greatly benefit any software development team. So, what’s the number one advantage of being a polymath programmer?

Polymath programmers are skilled at many programming related tasks.

But do you know the number one disadvantage of being a polymath programmer?

Polymath programmers are skilled at many programming related tasks.

The story of that fateful day…

It was a morning like any other. The sky was a soft blue, the morning air crisp with a hint of the Singapore afternoon heat, and I was friggin’ tired from the programming frenzy the night before.

I reached the office, greeting people along the way, and sat down in my office chair. The subtle difference? There’s no one in a 5 metre radius from my seat for the entire morning.

By a fluke of coincidences and emergencies, all the members of my team were not around. I would be the lone contact, the singular representative for matters directed to my team for two whole days. Some of you might think, “Wow! Power! Command!”.

No such thing.

My team was already small in size, so each member begun to take on more specialised areas of the team’s effort. I’m primarily in charge of most web application development, as well as a few complete systems, a few servers, software installation… anyway, I’m in charge of a lot.

What happened? Like a uncanny manifestation of Murphy’s Law, things started falling apart rapidly on my first day alone in the office. Users started to barrage me with requests and queries. Programs started to fail for the most unfathomable reasons.

Being the sole point of contact for my team members, the users who usually bug them, now bug me. They started with the innocently enough “Hi Vincent. I sent an email to so-and-so, but he’s not around. His out-of-office autoresponder email says to look for you. Can you help me?”, which escalated to the “You. Clear data. Now”

For the entire day, I did everything that my other team members would be reasonably expected to do on a normal work day (serendipities, misfortunes and all). This was in addition to what I would do on my normal work day. Programs failed, files weren’t sent, so I debugged C programs and shell scripts. A user asked for web application assistance, so I helped. Some users got new computers four times better (hard disk and RAM) than mine, and they’d be positively unproductive without the software programs developed by my team, so I went to install the programs.

Because I knew enough of my team members’ work, I filled in their shoes and covered for them. It didn’t make it right or wrong. It was just unfortunate. I was plug-and-playable, and that day pushed that quality to the limit.

It was a very tired and dejected man who stepped out of that office in the evening. That man used every ounce of whatever energy’s left to write this post too…

Just because you can do everything, doesn’t mean you should.

Back to Basics – Newton’s Method

I recently joined the Dream In Code family, and found that there’s a higher than expected number of responses from (university freshman) students asking for programming help. Then I read this article about classic computer science puzzles. There’s mention of an expert go player who still reads through fundamental go problems. The goal of rereading? To solve the problems faster than before.

This gave me the cool idea of revisiting my freshman computer science textbook. I graduated from a computational science course, as opposed to a computer science course. My lecturer gave this explanation for the distinction:

Computational science students use programming to solve scientific problems. Computer science students focus more on the programming.

For computational scientists, the main goal is to understand and solve science problems, be they from the realm of mathematics, physics or other sciences. Programming is just a tool to the solution, because using a computer to do calculations is so much faster than doing it by hand.

After years of programming and real world application experience, I wanted to find out how I would have solved those textbook problems. So I dusted off my textbook, and flipped through the programming exercises and found something interesting. The given problem was to use the following formula to find approximate roots:
Newton's method
The function provided was
f(x) = x3 – 3
and the derivative function was
f'(x) = 3x2
So basically we’re finding the cube root of 3.

There’s a brief mention that it’s the Newton’s method for finding roots of equations in the exercise question. Since a derivative of the function is required, I think the lecturer gave it to us back then, in case some of the students weren’t familiar with math differentiation. All that’s left was to code it.

The textbook was based on the C language, but I’m adapting it to C#. Here’s the code (download the full project)

const double epsilon = 0.000001;
double currentx, nextx;
double fx, fprimex;
int i = 1;

currentx = 1234;
// our best guess for cube root of 3
nextx = 1.5;
while (Math.Abs(currentx - nextx) > epsilon)
{
    Console.WriteLine("Iteration {0}: {1}", i.ToString("d2"), nextx);
    ++i;
    currentx = nextx;
    fx = currentx * currentx * currentx - 3.0;
    fprimex = 3 * currentx * currentx;
    nextx = currentx - (fx / fprimex);
}

I remember some key points about these kinds of assignments discussed during university days. They usually revolve around some sort of iteration process. So while loops and for loops were my constant companions. Loops were used to slowly refine a solution to a better one, hence the iteration process.

You might have noticed I used a const variable epsilon. Solutions at one iteration step are compared with the solution at the next step. The comparison usually involves comparison of their difference with zero. Since doubles are used, and zeroes don’t usually play nice with floating point variables, a small number is used, such that if the difference is smaller than this small number, then it’s deemed to be accurate enough.

Then comes the next pitfall: the infinite loop. If the difference never becomes small enough to terminate the loop, the program crashes. Sometimes, you might have to solve an equation where you don’t know if the iteration can terminate.

So comes the additional loop terminator: the number of iterations as an upper limit. I can’t tell you how many iterations to run before declaring it a failure. 10000 is usually a big enough number to try though. If the loop terminates when you know the solution can be further refined, then try increasing the iteration limit. I didn’t add this for the given code because I know the iteration process is very stable, and terminates after few iterations.

There’s also usually variables invariably named current, previous and/or next. It’s a characteristic of the iterative methods to be coded.

So what can you get out of this?

As a programmer, you will eventually come across something where the theory behind the (business) logic is unknown to you. Take heart that you might not even have to understand it! You only have to transform whatever it is into code.

This ability to bring theory into code is more important than understanding the theory itself.

There’s always a mathematician who can explain why Newton’s method works, but you’re the only one who can code it.

Are you making this restaurant service mistake when you code?

I visited two restaurants recently, and realised both made a common mistake. It made me feel frustrated, and generally unhappy about the experience. So what did they do?

They made it unpleasant for the customer (me) to buy and eat their food on their premises.

Case study 1: The Coffee Bean and Tea Leaf

Every weekday, I’ll go to the nearby Coffee Bean restaurant to take my breakfast before going to work. (The reasons why I do this is too numerous to explain. Perhaps in another post…) Recently, I started hearing some grumblings from the staff about students. It’s near exam time, and the students come to the restaurant, order a drink, down it to about halfway, and then sit in the restaurant for hours on end, supposedly studying.

The infuriating thing is, the students will come plop their stuff onto the tables and seats. Each student will effectively take up a four-seater-two-table place. If they’re happy, they might even share their table with another friend.

Now during peak hours, this is unacceptable to the restaurant. It is potentially losing four paying customers for one lousy-cheap-drink student. More importantly, I can’t have my chocolate brownie and Earl Grey tea on my off day weekends because of those students (there I’ve said it).

So the restaurant staff came up with a plan. One day, when I arrived at the restaurant for my breakfast, I felt a bit funny walking towards the ordering counter. Then I realised it. They’ve rearranged the tables and chairs.

All the tables were separated into single islands of one table with two chairs. They told me it was because of the students. It was a bit cramped actually, because the restaurant floor space was now reduced. I had to maneuver carefully to avoid spilling my tea.

I asked what if the students pushed the tables together. They said they’d tell the students they’re not allowed to join tables. After a few days, I asked them the results of their tactic. It seemed to have worked.

Now for the problem. Though aggravating, the students still represent a small percentage of customers. Why are they making all customers to have an unpleasant experience? From the front of the restaurant, the view looks kind of daunting, militant, uninviting even.

As immediate (and satisfying) as the table separation solution was, the long term solution should come from a management perspective, a design perspective.

Case study 2: McDonald’s

My nearby McDonald’s just underwent a renovation. Now it looks brighter, more woodsy-brown, different from it’s previous Hong Kong movie stars and music scene theme. The restaurant management also restricted the cashier line to just one, when they have three perfectly working cashier machines.

I’m guessing they’re trying to improve efficiency, since the staff at the sole cash register is working like crazy to get all the customers’ orders in. A receipt is all that represents the customer, which is pushed to one side while other staff scramble to fulfil the order.

This is like a multi threading problem, where before there’s three cashiers taking and fulfilling orders, and now there’s just one cashier taking orders with multiple staff fulfilling orders. In both cases, an attempt is made to move through the order taking and fulfilling process as fast as possible, in as parallel and concurrent a method as possible.

In theory, that should work. In practice, the user experience suffered. I would much rather that the one staff taking my order goes through all the way with fulfilling my order as well. Sure other staff can help out, but I want the same person serving me.

In the new method, my order was taken, and then I’m shunted off to the side, like some tool whose usefulness was spent. I don’t know who’s getting my drink. I don’t know who’s getting my burger. I don’t even know if anyone was doing anything for me. It sucks.

The coming together

When you go through your project requirements document (you do have one right?), do you simply want to get a certain function done, without giving any thought to how a user would experience it? Sure all the buttons are there, and all the display controls are there. But is it intuitive and easy to use?

I recently had this user explain to me how a screen from a legacy program worked. The sequence where she clicked buttons and checked output made no sense to me. She clicked a button on the bottom left first, then checked some data display, clicked another button on the top right, checked some more display, and clicked a button that was above the first button.

There was absolutely no logical flow to perform the task. Yet my user followed this pattern and was astounded that I had no idea how and why it worked. The user had conditioned herself into a negative usability pattern because there was no other way. I went back to my office, silently swearing at the programmer who originally coded the program. I swore even more after I saw the code…

Why was the user being subjected to this kind of service? As programmers, our users are like our customers. We should be treating them well, even if they aren’t paying us.

Are you making it hard for your users to use your application?

Mid-Autumn Festival, Mooncakes and Hidden Messages

The Mid-Autumn Festival is celebrated on the 15th day of the eighth lunar month of the Chinese calendar, which for this year is 25th September 2007. There’ll be much drinking of tea and eating of mooncakes. The mooncakes usually come in boxes of four. What is a mooncake? Let me show you:
Traditional mooncakes
It is made of lotus seed paste, usually with some lotus seeds mixed in, with a reddish brown outer crust. The ones I bought have a single (duck’s) egg yolk in their centers. There’s the plain (without yolk), double yolk and even the thoroughly sinful quad-yolk variety. They should then be quartered into bite sized portions, which are easier to hold with your fingers.

Here’s another variation, the snowskin mooncakes:
Petite sized snowskin mooncakes
The outer crust is flavoured. I bought small sized ones, each about the size of a quarter of the full sized mooncake. Mine are banana-, strawberry-, orange- and pandan-flavoured. Guess which of them they are?

Why are there mooncakes? The story goes that long long ago in China, a war was fought between the Chinese and Mongolians. The Chinese, faced with the impossible task of communicating with each other without the Mongolians knowing, came up with the ingenious idea of hiding secret messages in mooncakes.

The mooncakes were then speedily distributed and the Chinese leaders were quickly informed via the secret messages. The Mongolians didn’t suspect a thing. Word spread that the 15th of the eighth lunar month would be the day of the Chinese revolt. I guess the Chinese won.

My point, and I do have one

Why am I talking about mooncakes? Well, do you store text in hidden input boxes, but are supposed to keep them secret? The most common example is the password in plain text no-no. Even if the information isn’t exactly sensitive, having application-specific data flying around in digital space while the user is fiddling with the application is still bad.

Do you hide information in plain sight, like the secret messages in mooncakes?

Information knaves are getting smarter. If you dangle data in front of them, but use a simple trick to render data invisible, sooner or later, they’ll catch on. And when they do, you’d better have a backup plan.

Ok, I made my point. Now I’m going to go eat my mooncake.
Tip: Do not eat more than one whole sized mooncake at one go. My limit is half a mooncake per day, and no more than four per year.

Path of a Polymath Programmer Part 4

This is a continuation in a series of posts about my life experiences which eventually led me to be a programmer. As I look at my notes for the series, I’m thinking there’s enough material for a few more posts. Wow. You might want to do a recap of the previous posts:

Console games

I was an avid gamer in my pre-teens and teenage years. I remember going to my uncle’s place because he had a Famicom (or Nintendo, I don’t know the difference). A bunch of us boys would gather together and play on the console. The “in” thing then? Street Fighter.

By nature, I’m not a competitive person. But I like watching them play. They would take turns and pit their skills against each other. I could discern 3 levels of progression.

  • Learn to execute moves on the right side of your opponent
  • Learn to use a fighter other than your favourite one
  • Learn to use the joystick instead of the controller

The first level seemed particular important. They realised quickly that if they’re unfamiliar with the right side of the screen, they’re going to be sitting ducks as the other player whittled their energy bars and basically whooped their behinds. I watched with amusement as they struggled to execute moves on the right side, moves that they had no problems executing when they’re on the left.

The problem? A change of thinking, reacting and hand-eye coordinating was required. There’s a simple experiment you can try.

  • Fold your arms across your chest
  • Note the pattern, like which arm is over which
  • Now fold your arms the other way

It might feel weird the first time you do it. And that’s why the boys were struggling. You might want to try performing tasks with your non-dominant hand. Like brushing your teeth or writing or using chopsticks. Improves and increases neuron connections. Always a good thing in programming.

The other two levels of progression had difficulties similar to the first one. Both required a change of thinking.

So what was I doing while they’re struggling? Enjoying their company. I did spar with them, but it was on and off. I pack a mean punch with Ryu and they won’t know what hit them with my Chun Li slams. Heeyah!

The console wars

I don’t know what started it, but suddenly the other neighbours (some of which were the boys) bought their own consoles too. The Sega console was the next hot item. I think it was called the Saturn or Genesis then.

Some of the boys graduated to the different console (and neighbour’s house). It’s as though there was a fight for attention or something. Since a console was very expensive, and we boys were supposed to be studying and getting good grades, our parents weren’t too fond of buying consoles and the games.

Thus having a console and cool games became like a symbol of coolness. If you had one, then we’d flock to your house to play. It didn’t matter what console it was. If you offer cool games, we’re there.

The console wars eventually dispersed the boys, and even erupted in breakups of friendships. Granted, some of the friendships were tenuous at best, but we did have good times together.

My very own console

Well, my uncle was doing quite well then, and he likes me very much. So he said he’d buy me my own Famicom console! The console wars were just dying down, and I brought a schoolmate and my next door neighbour with me to those gatherings. My friends and I were suddenly out in the cold with no one to be with. And I didn’t want to impose on my uncle all the time. I think I even proposed that I’d buy my game, and he’d let me play on his console. That was how desperate (and addicted) I was.

He bought me a brand new Famicom console, and even gave me some of his games. Awesome! So now, my friends could come to my house and we’d play together. Ahh my very own posse…

Anyway, my friends played the action and fighting games. I joined in sometimes, but I’m really just happy to be part of the gang. [ok slowly bringing the focus to more relevant topics…] I actually found role playing games more fun.

I started playing lots of role playing games. My grades weren’t really affected, so my parents let me be. The thing was, most of the role playing games (and most of the games of other genres) were created in Japan and exported to overseas countries like Singapore. So the manual was in Japanese. The in-game conversations were in Japanese. The item, weapon and people names were in Japanese.

It took me awhile, but I started getting used to looking at the meaningless scrawls of hiragana, katakana and kanji characters scrolling along the screen until an action was required. Two options? First one’s probably yes, the second one’s a no. Anything more than that? Take your pick. If I chose the wrong one, I’d shrug it off, and made sure the next time I play, I would choose a different option.

The iconographical route to learning Japanese

Then there was this time, where I was just flipping through the manual of Super Mario Brothers. The manuals had colourful pictures, and though I couldn’t understand much, the graphics were nice to look at.

Super Mario Brothers textI was looking at the title Japanese characters of Super Mario Brothers, and then I had an epiphany. I could match Japanese characters to English alphabets! I started with the Japanese character “su” and matched it to anything that had an “s” based English phonetic pronunciation. Then I moved to add in other matches. Slowly I built up a Japanese vocabulary that was based in part on curiosity and in part based on an urgent need (I needed to understand what I’m playing!)

While I was playing these Japanese role playing games, I could pick out three distinct types of characters. Those that were wiggly and curly (hiragana), those that were straight or rigid curves (katakana), and those Chinese characters (kanji). I’m Chinese, so kanji was pretty ok, but there weren’t a lot of them and my Chinese wasn’t fantastic to begin with. My newfound ability to read katakana greatly improved my ability to understand the game.

Common RPG Japanese menuWhy would being able to read katakana be so useful? Because katakana is mainly used for foreign (as in non-Japanese) words, usually English. And there were enough of words used in role playing games that had foreign origins. Like battle menus.

My friends were astounded. There was this game where you play this Japanese soccer player named Tsubasa (means wings). There were power skills each soccer player could execute, and though they were powerful and pretty to look at, no one could understand what it was.

Then one of my friends, who attended Japanese lessons, helped out with the translation. Once, he got stuck at a word. He didn’t know what it was. It was in katakana. So I did my thing, voiced out the phonetic equivalent in my head, and translated it into an English word. It was “cyclone”. He stared at me in amazement. “How did you know?” Well, I was just pronouncing it in my mind. Sa-yi-ku-ro-ng. Cyclone. Simple.

The final translation frustration

Herb in JapaneseWith my two third knowledge of the Japanese language, I was able to breeze through most of the conversation in games (role playing or not). Like “Go to such-and-such town.”, “Find such-and-such item and give it to so-and-so”. I was just picking out katakana and kanji in keywords, and acting on them, while relying on my vast memory of known hiragana phrases to fill in the blanks. After playing for a while, I could match simple hiragana phrases too. Like yakusou for herb.

Then came the day where I was truly stumped. The game was Chrono Trigger. I was stuck in this square chamber with a clock in the center. And I had no idea what to do. I struggled for hours. I went around town and spoke to every single person. I went through my entire list of items to get clues. Nothing.

I was freaking out of my mind. So I did the only sensible thing. I bought a Japanese to English dictionary. Then I pored over every single Japanese character in the game conversation text, and translated them character by character, phrase by phrase.

It was with a cry of triumph when I finally set down the dictionary. So what was I supposed to do? Hugging close to the perimeter of the square chamber, I was to run three times clockwise. I can’t tell you how happy I was when I did that, and heard a satisfying clink, signifying that the correct action had been taken.

Conclusion

I would say that playing console games was an important part of my life. I’m not saying it works for everyone, just that they offer something of value to learn. If you can recognise it that is. Hand-eye coordination from fighting games. Critical thinking from strategy games. Problem solving skills from role playing games.

Ok, so that was a long post, and I’ve still got some stuff I want to highlight. Well, I’ll wrap it up here and we’ll continue in another post. See you!

Continue to part 5

BlogRush – the first rush

[Note: there are referral links in the post]
BlogRush widget capture I just read an article from Yaro about this new blog widget/technology called BlogRush. Intrigued, I went to take a look and after watching the introduction video, I was moderately interested.

But I was actually ready to abandon the whole idea, because it sounded a bit too fantastic. Then I thought that this was an excellent chance to do some blog traffic experimentation. So here’s a brief rundown of how it works.

  • Sign up for an account, where you’ll then be given some Javascript
  • Stick that Javascript code into your blog
  • Wait for traffic to come

That’s the easy part. Now for the technical part. Every time your page is loaded with the widget, you get one credit. For every credit you amass, your blog is shown on another blog’s BlogRush widget. So this means, the more your blog is visited, the more your blog is shown on other blogs, which brings more visitors.

Here’s the cool part. For every referral you make by getting someone to sign up for BlogRush, their credit is added to your own. And for every referral that person make, you get their referral’s credit too. It’s a multi tier thing, and it goes up to ten levels deep.

This was where my internal alert came up. I thought on it for a while, and decided that it could be marketing done well. It’s similar to other means of marketing, like MyBlogLog. So after deliberating for another few minutes, I decided to give it a go.

Besides, it might be fun to see how a startup technology perform. Here’s the link again: www.blogrush.com

[Update]
Just checked my inbox, and received an email from John Reese, the founder of BlogRush. Turns out the referral system isn’t one credit per referral all the way down the ten tiers, as I originally thought.

1st Generation Of Referrals (Directly From You) = 1:1 2nd Generation Of Referrals (i.e. Jen in the video) = 1:1 3rd – 6th Generation Of Referrals = 1:4 7th – 10th Generation Of Referrals = 1:8

1:1 means you earn 1 syndication credit for every 1 impression of the widget by your own traffic or by any users located on the 1st (direct) or 2nd generations.
1:4 means you earn 1 syndication credit for every 4 impressions of the widget by any user located on the 3rd to 6th generations.
1:8 means you earn 1 syndication credit for every 8 impressions of the widget by any user located on the 7th to 10th generations.

Anyway, after giving it some thought, BlogRush will need a really scalable system or they’re going to crash. Just remember Friendster. And this is going to be much more calculation intensive. I would think most bloggers have more readers as referrals than people have as friends. And this is supposed to be ten levels deep.

Crash and burn? Only time will tell…

Blog Action Day 2007 – Spread the news

Blog Action Day is an initiative to bring mass participation of bloggers to talk about one issue on one day. The topic this year is the environment.

The day is slated for 15 Oct 2007, so you still have time. There are 3 ways you can participate:

  • Post something on your blog about the environment on that day
  • Donate your earnings for that day to an environmental charity
  • Promote Blog Action Day

Check out who else is participating at the Blog Action Day website!