Wednesday, November 14, 2007

Lavish in praise

I make it a point to reinforce others by highlighting the good things about them. In doing so, I hope to make their days a little brighter and bring out the best in them. But, as usual, there exists a gap between idealism and practical reality. I am a man of few words, which usually means I can stay out of trouble, but I've found that more words are usually better when giving quality encouragement.

For example, I could say, "I like your painting."

What actually goes through my head when I'm thinking that up is, "I like your use of high contrast. I know you went out of your comfort zone here since low contrast colors are your usual fare, and this turned out well. I noticed the attention to detail you put in the left section where the fence is. How did you manage to pull off those shadows?"

But I somehow can't put it into words quickly enough.

Or, I could tell someone, "You don't have to worry. You have what it takes to succeed." If my buddy is down in the dumps and grasping desperately at any reinforcement possible, this will probably make him feel better.

But it's so much more satisfying to hear, "Look, you've got what it takes to succeed. I've seen your analytical and problem-solving skill when I was taking classes with you. I noticed that you broke things down into manageable pieces instead of tackling big impossible problems all at once. You may think your attention to detail is nothing special, but once you get out there you're going to find that it's really a rare quality. And I know you're very ambitious and very driven. You're just feeling a little apprehensive because this is a new situation. If you really want me to name off one thing you need to improve on, it's relaxing under new situations."

Expounding upon the details does two things: it validates your sincerity, and deepens the sense of encouragement you impart upon the other person.

If you absolutely can't think of more to say, you're probably not being sincere. I questioned my own sincerity many times, but at this point I'm sure that the problem is usually that I'm a little rusty getting words out since I'm writing code all day. For me, having to talk about something means I have to know it pretty deeply and pretty well.

I have a theory about why I get a deeper sense of encouragement when people go into details about my good qualities. It gives me many hooks to latch onto, little things that I can evaluate as true or false. Am I really good at this? Wow, she thinks I'm good at handling people? I know I wasn't born like that — in fact I am pretty socially awkward — but it's good that I come off as a natural. The more hooks there are that sound true enough, the more thorough and more solid is my self-esteem after a friend's pick-me-up.

Sunday, October 14, 2007

You mean you can't read my mind?

Once again, I've had it hammered into my head that communication is important. The problem always boils down to me thinking that people can read my mind. In my traditional step-wise approach to problem solving, I hunted for a first step to take. For this first step, I chose to answer the question, "Who needs to know what I'm thinking and doing?"

At this point in my life, it seems that I've got to communicate with a lot of people. It's far from an isolated time.

At the very minimum, I've got to communicate with my girlfriend, my family, my housemates, my co-workers, and my customers. That's a lot of communicating to do — and this is just the bare minimum to get by. It's hard to even address this bare minimum.

Now for the second step: given this narrowed down set of people to communicate with, what potential problems are there? The answer to this is different for each party concerned.

For example, with my girlfriend, I've got to pick the right words and be sensitive to what she's feeling. As a guy and as a software engineer who gets very absorbed in my work, this is difficult. So I turn to literary giants such as Tolstoy and Hugo to teach me how to express myself.

With my co-workers and customers, I've found that the biggest hindrance to my communicating effectively is that things get too busy and I just want to cross items off the to-do list. Often, that's not enough in a business environment because people have to be aware of what you're doing. Often times, communicating means slowing down to express myself. This is at the expense of absolute personal productivity, but in a team environment this is necessary overhead.

I have yet to figure out what keeps me from calling my mother more often. I've just moved into a new house so I'll have to figure out how to communicate with the housemates. It's funny because people can live together while not communicating at all.

Here's to good communication and not expecting people to read my mind.

Tuesday, June 19, 2007

My change-the-world money

Money makes the world go 'round. No matter how many of these heart-breaking letters Doctors without Borders, the Grameen Bank, or Amnesty International send me, I won't have anywhere near enough in the foreseeable future to send much to all of them. I can only pick one at a time.

I once read that good entrepreneurs are inherently insecure people — that they're insecure about their material wealth and status, and so they work hard to acquire more, and are never satisfied. In this sense, I worry about my own effectiveness as an entrepreneur, because if that greed is what has to serve as the driving force or the fire or the motivation — whatever you wish to call it — then I am severely lacking it.

It's commonly accepted that the most powerful force that can drive a man is self-interest. Now, the only reason I see for amassing billions in personal wealth is to make the world a better place. I'm a little embarrassed to admit such a touchy-feely motivation — I like to think of myself as a hard-driving capitalist. The people I see most effective in the world are those with loads of cash, and the touchy-feely people I know seem to be digging dams with spoons.

I could make a difference on a small scale, and it's true that everything has to start on a small scale. Even in my line of work, I work iteratively and start small on pretty much everything I do. Maybe one day I'll be okay with just chipping away at enormous problems in the world rather than blowing them to smithereens.

Tuesday, April 24, 2007

China Import and Export Fair in Guangzhou

Last week, I went to Guangzhou, China for the 101st China Import and Export Fair (中国进出口商品交易会).

China Import and Export Fair Outside

Here's the view from our 18th floor hotel room. We got a better deal on our hotel than most of the other visitors because my father's friend is from Guangzhou. This friend's sister-in-law is a hotel manager.

View of Guangzhou from the Hotel

Everything in China just has to be huge.

Inside the Pazhou Complex

The big heavy machinery was necessarily outside. Here's a forklift company with shiny forklifts.

Shangli Forklift

I have no idea what this power company does, but they had a nice booth.


Because of the immense size of the fair and all the heavy catalogs I was carrying around, I had to step outside to rest my feet and my shoulders for a bit. This is the place right by the street where people were allowed to step outside for a quick smoke.


The following is a large expanse that they were just preparing for the second phase of the trade fair.

Phase 2 Being Prepared for Setup

Inside the complex, there were even more displays, but the booths were far smaller.

Pazhou Complex Show Floor 2

Here's my father at the Health and Beauty Products portion of the fair, with a representative of the Chinese company that makes the pictured device.


Finally, proof that I was actually at the fair. I think I had to run out of the way very shortly after this picture was taken, so that a bus full of people could get through.

Me by the Fair Banner

This was a very eye-opening trip for me and I've written down a lot of ideas from the trip. I took enough notes to be satisfied, but I could have taken more pictures, and I regret not taking one of the Pearl River at night with the boats and buildings all lit up and flashing.

Tuesday, April 10, 2007

Ethanol can be made from corn or sugarcane

For as long as I can remember, I've been excited about environmentally-friendly solutions.

For energy, my dream for clean energy centered around solar and wind power. For barren soil, it was composting. For everyday fuel, I thought of renewable sources such as ethanol or hydrogen. Now I'm glad it's becoming more widely adopted; I thought I'd never see the day when such things would actually become economically feasible.

There's an ethanol craze sweeping America at the moment, and I hadn't bothered to read much about it until this week's Economist leader, "Castro was right," pointed out that there are two main ways of producing ethanol on an industrial scale: corn and sugar.

Ethanol advocates often point to Brazil as a shining example of a large country that uses ethanol on a large scale. Knowing that Brazil is doing fine with massive ethanol deployment made me more excited about having it in the United States, until I found out that their ethanol is made from sugarcane, not corn. The advantage to having it made from sugarcane is that the energy requirements are lower, and it's much less subject to the anti-ethanol accusation that it costs more energy to make the fuel than we can get by using it.

Now, the idea of making ethanol from corn is more likely to fly in the United States. I like to think practically, and I know that the farm lobby is a formidable force in American politics. Corn-based ethanol has broad support, and it's likely to enjoy subsidies.

According to the USDA, sugarcane is already grown in Florida, Hawaii, Louisiana, and Texas. The Economist article named developing countries with tropical climates (India, the Philippines, Cuba) as possible sources of sugarcane-based ethanol. If that were feasible, that would be a great way to get business going again in the Philippines, where my father shut down his factory due to intense competition from China and Vietnam. The energy business can be very lucrative.

Thursday, March 29, 2007

JavaScript syntax highlighters

I'm really into writing documentation, and very often, this documentation must include code samples.

I wanted a JavaScript syntax highlighter that:

  1. involved very little hassle in setting up,
  2. worked like a real parser using parse trees to ensure accurate highlighting,
  3. and provided decent coverage of the most common programming languages in use today.
Obviously, by opting to go with a JavaScript syntax highlighter, I chose to forgo the option of doing my syntax highlighting on the server side. Doing it on the server side still interests me, but for immediate and practical reasons, the quickest way to get syntax highlighting in my documentation would be to do it on the client side.

I went searching around for JavaScript syntax highlighters, and these are the top three that met my criteria.
  1. Javascript code prettifier. This was the first decent one that I found. It's pretty basic but I got up and running very quickly. The documentation is sparse and the tone of the README quite terse, but it meant there was less for me to sift through. The neat thing about it is that it has automatic language detection.
  2. SHJS. This is more full featured than the Google tool, and supports a wider range of languages. It appears to be more mature than the other two. Unlike the Google solution, it doesn't offer automatic detection of programming languages.
  3. JUSH. I'd like to check it out in more detail later on, but the website says it only supports HTML, CSS, JavaScript, PHP and SQL. I needed highlighting of Java and Ruby, not to mention C and C++.
For now, I'm going with the Google code prettifier, just because it was the first one I found, integrated, and liked. One that I did not like was dp.syntaxHighlighter, mostly because it required that my code be in a TEXTAREA instead of a PRE (pre-formatted field).

Wednesday, March 28, 2007

Where the rubber meets the road

Back when I was writing software that ran on HP LaserJet printers, I hated having to wait 45 minutes for one-line changes to compile (in a ClearCase build system) and then burn to flash memory. Sometimes, a problem with the printer's behavior wouldn't even be a problem with my software. It would sometimes be caused by an obscure bug in the hardware.

Because of time to market pressures, the team would have to work with prototype hardware, the design of which wasn't even finalized yet. The guys who wrote the low-level code had to write some registers and hack their way around hardware defects.

Somehow, it seemed wrong to me that I should constantly be worrying about the integrity of the underlying hardware or the operating system on which my software ran. I should have been able to take it for granted.

I longed for the day when I could instead work on web applications, where I could safely assume that the hardware was fine and that there were no major defects with the platform on which I was building. The platform on which my software ran would come already debugged, I figured.

Since diving more deeply into web application programming, the experience has been as good as I had imagined, for the most part. There's always a lot of documentation out there, and it's usually just a matter of searching through Google results to see which one relates best to the problem I have at hand. I rarely get stuck for long.

If you ask most web developers, the worst thing and most frustrating thing about writing web applications would probably be cross-browser compatibility. Different browsers handle CSS and the JavaScript DOM a little differently. It's the bane of many a web developer's existence.

When I'm working on getting a web application working with different browsers, the thought crosses my mind that I'm wasting a lot of time by having to check for compatibility with browsers that should just work. It seems like an enormous and unnecessary waste of time.

After thinking about it, though, every software industry has its area of "inefficiency" for developers, and that's usually where the rubber meets the road. It's where the software, however elegant it is, has to face the real world in all its ugliness and imperfection.

In web applications, cross-browser compatibility in web applications is needed because that's where the application faces the real world, where people use all sorts of different browsers.

With Unix software, there are portability issues between different kinds of Unix. There's the worry of having to work with different thread models and libraries. There's the process of having to build with different compilers, not just gcc. There's GNU make and BSD make. The #ifdefs and #defines aren't any prettier than JavaScript workarounds.

Network software has to know how to deal with extensions to a standard that may not be universal. The RFCs are great: they've helped to avert major compatibility issues in the past, but technology companies are inevitably going to shoehorn in their own little extensions to network protocols. Clients need to know what servers are capable of, and servers likewise.

The point is, when I think about it, having to check for cross-browser compatibility doesn't seem all that bad. Yes, it does mean that hours and hours will be gone from the day trying to hunt down the problem. Yes, it could have been better if Microsoft had tried to follow standards in their implementation. Yes, many other things could be done in the future to better the current state of things: there are libraries and frameworks out there that abstract away much of the pain, just like people have figured out how to create portable Unix programs (grab a copy of the autotools and run a configure script). But at the end of the day, the reality is that people out there are using different browsers to view the same site, and it's my responsibility to make sure my application works. It often seems like a huge waste of time, but it's that final push that really makes the difference.

Saturday, March 17, 2007

Physical media and bit rot

Last night, I played some of my old classical music CDs — good music to program to. The songs skipped every other second because of the scratches on the discs. It appeared that my careless handling of CDs over the years eventually caught up with me.

Tonight, I ripped some of these to Ogg Vorbis (an open and royalty-free file format similar to MP3) to see if I could listen to my songs without the skipping. Sure enough, they were all smooth!

Now, none of this is stuff that I'm terribly surprised about, but it just served as a reminder to me that relying only on physical media to store data is a little dangerous, especially when the medium goes bad or acts flaky. The lifetime of information on the network is short, but as long as it's out there, stored and accessed frequently, it's constantly being duplicated and refreshed.

Information that's alive and circulating is healthy information.

Thursday, March 15, 2007

HBR: "Leading Clever People"

This month's Harvard Business Review contains an apt and timely article, "Leading Clever People." Rob Goffee and Gareth Jones define clever people as "the handful of employees whose ideas, knowledge, and skills give them the potential to produce disproportionate value from the resources their organizations make available to them." Still, this doesn't mean that they're better off working on their own. One of the people they quoted, the head of development for a global accounting firm, stated that clever people "can be sources of great ideas, but unless they have systems and discipline they may deliver very little."

One good point they made about managing clever folks is the importance of demonstrating that you're an expert in your own right. This is to establish credibility and respect. At the same time, one mustn't be so above-and-beyond or in-your-face so as to discourage the real talent.

Read "Leading Clever People" at HBR. You may have to view an ad.

Thursday, February 22, 2007

Parsing lists of e-mail addresses

I came across a situation where I had to parse a list of e-mail addresses. E-mail clients these days take e-mail addresses in two forms: one showing the name of the individual as well as their e-mail address, and one with only the e-mail address.

When multiple e-mail addresses are listed, they are separated by commas, whether they're of the full form or of the simple form.

When I had to extract the list of e-mail addresses initially, I assumed only that I could separate them using commas. This would capture a list such as the following.

"Joshua Go" <>,

It would capture two e-mail addresses: "Joshua Go" <> and

A problem arose when I came across one form of the full e-mail address that threw off my simple parsing technique: the occurence of e-mail addresses such as "Go, Joshua" <>.

Since I am no master of regular expressions, and working with regular expressions in Java has somewhat been painful for me, I decided to review my EBNF parsing.

The following is the EBNF syntax, from what I know.
EmailAddressList    = GeneralEmailAddress [ ',' EmailAddressList ] ;
GeneralEmailAddress = [ RecipientName ] '<' EmailAddressOnly '>'
| EmailAddressOnly ;
EmailAddressOnly = Username '@' Domain ;

My co-worker, Wilson, pointed out that I defined neither RecipientName, Username, nor Domain. For that, I cite the practical demands of industry as my explanation for not adhering to strict academic formality. I also omit it for clarity. Basically, assume that they'll just be alphanumeric (letters and numbers).

Perhaps in a later post, I'll put up the source code to the parser. As it stands, I've yet to move it over from being a test program to being integrated with the rest of our product.

Friday, February 9, 2007

Strained relationships and great undertakings

Last night, I picked up a book and read the preface at the beginning of the book, and the "Special Thanks" section caught my attention. The author thanked his wife and daughter for "putting up" with the authoring process. This isn't the first time I've seen that kind of thing written in a preface.

Does writing a book necessarily have to put a strain on the author's family?

Thursday, February 8, 2007

Arrays in Visual Basic and classic ASP

For the programmer who is used to C-like syntax, working with arrays in Visual Basic or classic ASP can be aggravating.

In this post, I will briefly go over declaring single- and multi-dimensional arrays, then iterating through them — the basic operations that make arrays useful.

One-dimensional arrays

Let's declare an array with six elements.
Dim OneDimArray(5)

Yes, that says "5", but it has six elements. When we're going through the elements of this array, we'll start counting from zero and end at five.

Iterating through one-dimensional arrays

For i = 0 to UBound(OneDimArray)

There will be six elements iterated through.

General notes about arrays in Visual Basic

So far, we're left with the impression that Visual Basic is a strange language. When we declare arrays in VB, the real size is the declared array size plus 1.

If you're used to programming in a C-like programming language such as C++ or Java, it's the declared array size, period — although you still start counting at zero. The following would give you a five-element array of integers in C++ and Java.
int one_dim_array[5];

You would access the elements of this C++/Java array with one_dim_array[i] where i = 0,1,...,4. Accessing it with index 5 would take you outside the bounds of the array.

In Visual Basic, however, you get a six element array when you declare the following.
Dim OneDimArray(5)

You can access OneDimArray(i) with i = 0,1,...,5.

Multi-dimensional arrays

The following is a declaration of a two-dimensional array.
Dim TwoDimArray(4,2)

This declaration would give us an array with five rows and three columns.

Here's how a three-dimensional array is declared.
Dim ThreeDimArray(5,6,7)

This gives us a 6 by 7 by 8 array. That's (5+1) by (6+1) by (7+1) because of Visual Basic's array syntax.

Finally, we'll generalize into the case of an n-dimensional array.
Dim EnDimArray(x_1, x_2, ..., x_n)

Iterating through multi-dimensional arrays

Here's how you'd iterate through a two-dimensional array.
For i = 0 to UBound(TwoDimArray)
For j = 0 to UBound(TwoDimArray, 2)
Response.Write(i & "," & j)

The major difference between iterating through this and iterating through a one-dimensional array is that we called UBound() with two arguments instead of one. This is so that UBound() knows which dimension to look up the upper bound for. In this case, our inner loop stops at the upper bound of the second dimension — that's why we specified the "2" there.

For three dimensions, the logic is similar.
For i = 0 to UBound(ThreeDimArray)
For j = 0 to UBound(ThreeDimArray, 2)
For k = 0 to UBound(ThreeDimArray, 3)
Response.Write(i & "," & j & "," & k)

In the innermost loop, we specified that we needed to look up the upper bound for the third dimension.

Finally, the general form for iterating through an n-dimensional array's n dimensions.
For i_1 = 0 to UBound(EnDimArray)
For i_2 = 0 to UBound(EnDimArray, 2)
For i_n = 0 to UBound(EnDimArray, n)
Response.Write(i_1 & "," & ... & "," & i_n)

Why we need UBound()

The UBound() function can be called with either one argument (just the array name), or with two arguments: the array name, and a number representing which dimension we want to count the upper bound on.

Without UBound(), we can't know the upper bound for the particular dimension we're looping through at the moment.

Wednesday, February 7, 2007

Accented characters with a US keyboard in X11

I've always been too busy to figure out how to map the useless Windows flag keys on my keyboard to do something useful in Linux/X11.

On traditional Unix systems, there's a Compose key. According to Wikipedia, "On some computer systems, a compose key is a key which is designated to signal the software to interpret the next keystrokes as a combination in order to produce a character not found on the keyboard."

To see what the Windows flag and menu keys are mapped to, I ran the following.

xmodmap -pk | grep 11{5,6,7}

This resulted in the following output:

115 0xff20 (Super_L)
116 0xff20 (Super_R)
117 0xffcc (Menu)

This output told me that the flag keys (left and right) were free to map to Multi_key. I figured I would leave the menu alone.

Next, I had to perform the remapping. I created a file, .Xmodmap, which is sometimes already there in a user's home directory. For me, it wasn't, so I went ahead and created .Xmodmap with these contents:

keycode 115=Multi_key
keycode 116=Multi_key

I then refreshed my keyboard mapping by running:

xmodmap .Xmodmap

To see if the re-mapping worked, I held the flag key down while pressing the n key, and typed in a tilde (~). The resulting character was the ñ character. Presto!

Friday, February 2, 2007

Goals are good for people who tinker

I like to tinker so that I know how every little bit works. I also like the feeling of knowing I've achieved something. I'm sure it's already apparent to the reader that these tendencies sometimes come into conflict with each other.

My tinkering leads to more extensive knowledge. Undoubtedly, it has helped me many times in the past, and I continue to reap the benefits of my past fiddling.

Still, I hold myself to strict standards of productivity, and I become frustrated when I can't do enough in one day. Setting clear and reasonable goals for myself allows me to satisfy both my hankering to tamper and my drive to have something to show.

Tuesday, January 30, 2007

Separate user for each webapp's MySQL database

The following commands will create a separate user for each MySQL database.

> GRANT ALL PRIVILEGES ON PureExample.* TO 'pureuser'@'localhost' 

This is good practice when writing web applications, so that each web application has its own database user.

Sunday, January 28, 2007

PDF bookmarks with LaTeX

After the mail fiasco was taken care of, I decided to pursue one of the things I've been wondering about: how to make PDF files have bookmarks (those links on the side pane that let you jump to well-defined sections of the document). For my setup, all I had to do was add this in my document:


Since I use Ubuntu, I had to install the tetex-extras package, which contains hyperref.sty for running pdflatex.

Thursday, January 25, 2007

Thunderbird's "too many connections" message and Courier IMAP

When we use Mozilla Thunderbird at my workplace for our IMAP mail, Thunderbird often tells us that we have too many connections. It makes going through my folders impossible. This article explains that it's because Courier IMAP (which is used by Plesk) limits the number of connections from a single IP address to something like 4. Since we're all behind a firewall, we're all considered to be one user, as far as the server is concerned. I just had to change the values of MAXDAEMONS and MAXPERIP in /etc/courier-imap/imapd to allow more connections. Mozilla Thunderbird caches something like 5 connections by default, so even one user will put the IP past the limit.

While I was figuring my way around this problem, I set up another server to copy my mail over. It's an Ubuntu machine and I just used the distribution's Courier IMAP, but since I've been using UW-IMAP all these years, the configuration process for getting a system user up and running was completely foreign to me.

It turns out all I had to do was run this as that user in the user's home directory:

maildirmake -S Maildir

So now I have a nice little IMAP setup, pretty much out of the box. Some assembly required, apparently. To really understand it, I should do some deeper reading of my source for this command.

One problem with my setup right now with this single command is that it's not yet integrated into the MTA on the system, so that mail can't be delivered into that mailbox, only copied via IMAP in a mail client such as Thunderbird.

Wednesday, January 24, 2007

Iteration produced the Constitution

The other day, I was in a meeting with a potential customer. I explained that when I'm faced with the daunting task of having to build something complicated, I take what's called an iterative approach.

Taking an iterative approach starts with an early phase of exploring the problem by creating a quick, throw-away prototype that works. It gives a sense of what's possible and what's not, and quickly pokes holes in any weak spots in the overall idea.

Sometimes, I think I'm crazy for taking this approach, but it works wonders for me. It helps that people like the folks at 37signals and Fred Brooks have written explanations of the methodology more thoroughly and eloquently than I could possibly write, but I was doubly reassured during my reading lately when I read about how the United States Constitution came about.

In particular, the odd setup of our legislative branch is due to an iterative approach the Founding Fathers took at the Constitutional Convention in 1787. Large states favored a scheme now known as the Virginia Plan, which proposed a two-house legislature where both houses had representatives that were apportioned according to population. The smaller states favored the New Jersey Plan, which proposed a single chamber with one representative from each state.

Now, we look back on the process with our mighty historical hindsight and we look at the Virginia Plan coming from the large states. We might be tempted to think, "Oh, they're just pandering to their own interests. What a crock. That's a terrible scheme to have. How dare they have the audacity to propose something so blatantly self-serving?" The same could be said of the small states.

But what's important is that they tried. They came up with something, put it forth, and asked, "How about this? What do you guys think?" Both the large states and the small states knew that their proposals would have holes poked through them, but they gave it a shot so they could make some progress.

And when this happens, you get something like the Connecticut Compromise, which looked at what everyone thought of the schemes proposed up until then, and said, "Hey, if we go with the Virginia Plan's two houses, we've got some room to work with. What if we make representation in the lower house proportional to population, but give each state equal representation in the upper house, like the New Jersey Plan proposed?"

If even the Founding Fathers had to resort to iteration, I would think it mighty cavalier of me to think I could possibly plan out a complicated system in one fell swoop.

A cheap and nutritious lunch

I remember when I first tried ugali during my trip to Kenya last May. It didn't taste like it had much nutritional value, but it made me full very quickly.

It's been a slow month at the company, so we've been saving some money on food. I have stopped going out to lunch, and instead I go home to my apartment and cook myself some pasta. I treat myself to parmesan cheese on top, but no meat.

The trouble with this is, it has been tough to get full, even after a lot of pasta.

Today I was impatient and ate two bowls of cereal while my pasta was cooking. I ended up having room for only one bowl of pasta, and I was stuffed. Normally, I'd eat four bowls of pasta and still be a little hungry. I guess I accidentally stumbled upon a solution to staying full.

I'm writing this down for my own reference: for cheap eats, have two bowls of cereal and a bowl of pasta.

Tuesday, January 23, 2007

Helping the rich world keep its livelihood

This week's Economist cover story, "Rich man, poor man", about globalisation's winners and losers, offers three categories of solutions to help out those who lose out.

  1. Education in rich countries must equip people with general skills that make them more mobile in the workforce.
  2. Detach health care and pensions from employment, so people who move jobs don't have to worry about much else.
  3. Beef up assistance for those who lose their jobs, in the form of generous training and policies to help them find new work.
These all sound good, but as the editorial acknowledges, these will take years to implement, and it won't be easy. I've also got my own reasons to be skeptical about the effectiveness of these general measures.
  1. People who are part of the educational system in rich countries will see these "general skills" as irrelevant because they want something that's very close to practical. It's difficult to learn something if you're not really interested.
  2. I never really understood the wisdom of tightly coupling health care and pensions to people's jobs, either. Benefits, when tied to jobs, are peripheral concerns, but I suppose it's a temporary hack in the system that just happens to meet the needs of the moment. The thing is, there is no other viable alternative at the moment to this dirty hack.
  3. Greasing up the labour market to make it more mobile is a task I'm very passionate about, but I'm not sure where government or industry can step in effectively. For private concerns, it may not really be profitable. It's an area where I see a lot of room for improvement, but most of the ideas I've got to remedy the problem are more humanitarian than profitable.
It also occurred to me that it may actually be in the rich world's interest to not have job security--or rather, security at the same job. Personally, I have trouble working on the same kind of thing for more than two years, at best, and I am one of the least fickle people I know. It's always best to keep one's options open.