Chinese Lunar New Year office decoration

In a couple of weeks, the Chinese Lunar New Year will arrive. The exact date is on the 7 February (Thursday), and the 7th and 8th are public holidays in Singapore.

It’s a ritual. Once past their due, our unofficial office decorator will take down the Christmas decorations, and replace them with the Chinese New Year decorations. She even has a system for rotating decorations…

So along our partition walls, we have
Welcome spring
The four Chinese characters are (from the left), “welcome spring receive blessing” literally. Feel free to replace “blessing” with “fortune”. The last character is a bit ambiguous in meaning. In this context, it just means something good.

Then we have
Fortune god
It’s a traditional thing to have the typical picture of a boy and girl around somewhere in decorations. I’ll have to go look it up why… The two sets of 7 characters, one on each side, is a bit harder to translate. The rough translation for the left set is “lots of good fortune, happy every year”. It can also be “great fortune, prosperous every year”. Chinese characters pack a lot of meaning into one word… The right set translates to “God of fortune descend (arrive), meet (have) good fortune”.

The ceiling wasn’t a problem for hanging Christmas decorations, so this is a cinch.
Hanging fish decor
Those 3 characters literally translates to “year year have”, or “every year have”. Have what? That fish under the three characters? In Chinese, “fish” sounds identical to “abundance” (or “extra” to be exact). So that decoration signifies abundance in every year. In the past, when people were poor, this used to mean abundance in food, particularly rice, the main staple. Now it just means anything you consider to be good, like money or fortune.

And where the Christmas tree used to stand, the brightly and auspiciously coloured vase took its place.
Auspicious flower vase
The two orangey things are Mandarin orange displays. During the New Year period, we Chinese exchange Mandarin oranges (real ones) with each other. Why? Well, in Cantonese, Mandarin oranges sound exactly like “gold”. So we exchange “gold” with each other. More to the point, we give “gold” to another, and receive “gold” from another.

I know the phonetic similarities stretches meanings a bit, but Chinese are like that… *smile*

Difficulty transitioning from academic to professional

Graduation by Baris Simsek @iStockphoto

For some time, my current employer had been sending work offshore. Specifically, sending some programming work to China. I’ve been tasked with handling these invisible developers on and off. These developers are mostly fresh graduates, with no experience and barely enough knowledge to write something in ASP.NET or C.

There’s also a high turnover rate, meaning there’s a lot of developers coming and going. Anything more than a few months, and you can consider giving that developer a long service award. I think the reason for this phenomenon is that the developers are finding it difficult to transition from an academic environment to a working professional environment.

In school, if they can’t solve a problem or do a task, so what? Now, they have to do it. They have to do it by themselves usually. The familiar teacher and fellow students are gone. Sure, we provide guidance and be mentors to them. But we actually expect them to perform and give results.

I have seen some seriously detailed specs to them for development work. My thoughts had always been that, by the time I wrote something that detailed in a Word document, I could have used the time to write the code. I’ve always believed that sufficient guidance is necessary, but if I had to think for them the programming logic, then their coding ability is up for question.

The points listed below summarise some of my observations. Take note that they’re based on typical education environments and typical work environments. “Typical” is also based on what I know. Feel free to let me know how your situation is like. I’d love to hear your side of the story.

Standard answers

In an academic environment, you were given standard questions with standard answers. Sure, the questions weren’t identical, but the differences were really minor substitutions. As such, the method of arriving at the answers were standard.

In Singapore, we have what’s known as the “ten-year-series”. As in, “Have you bought the ten-year-series for chemistry?” What’s a ten-year-series? It’s a compilation of questions from the past ten years. Of course, a more appropriate name would be 20-year-series (or more) now. Students would practice and excel on the questions in the compilation, and were almost guaranteed good grades.

My guess is that it’s hard to come up with new and challenging problems every year, so exams come mostly with standard questions, plus a few tough ones to find the brighter students. Any teachers or any readers associated with the pedagogical profession, please feel free to correct me.

The work environment is different. You’re thrown new problems everyday. There aren’t standard answers to these problems. Heck, there aren’t even standard consequences from your solutions, even if they are correct.

For example, you could have solved a difficult technical problem with a brilliant answer. If the customer suddenly didn’t want to do that project, you still failed. Or your superiors are unappreciative morons, and brushes your efforts aside. Be brilliant in the right areas.

Flexible hours

When you’re in university, your study hours were so fluid, you could have lessons packed one day, and be totally free the next. Some people took this uncertainty and developed self discipline. They were able to organise their time even though their timetables jumped all over the place from one semester to the next. Some people weren’t blessed with this fortitude, and whiled their time away.

Come working life, you’re expected to put in hours. You’re expected to be in the office at a certain time, and “allowed” to leave at a certain time. Googlers and other employees of companies with more open policies, you rock.

Suddenly, your freedom is gone. You feel chained, you feel like the creativity and the fire in you die… Stop that! You’ve obviously chosen a profession ill-suited to you. Take this opportunity to learn about what your work is, then move on to something better.

Or better yet, work with your employer and see if you can arrange something more flexible. Working from home or more flexible work hours are options you can ask for.

Theoretical

I don’t know about you, but much of my university days were spent proving some math problem. Or writing programs illustrating the use of some theorem (math or computational science). I didn’t know how injectivity and surjectivity was going to help me in life, but I learned them anyway.

Your job in a professional capacity is to solve problems. Real world practical problems. Your solution suddenly makes a difference, for better or worse. It doesn’t matter what your qualifications were, or how much experience you have. Real world practical problems require practical solutions that can stand the test of time (at least for a while). That piece of messy code you wrote? Go fix it.

Your education in academia should be treated as training your mind. You’re not so much learning those (boring) subjects as much as training your brain, forming new neural connections and creating new thought processes. Learning about injective functions and surjective functions made it easy for me to pick up the concept of joins in SQL. One-to-one and one-to-many relations between database tables became a snap to understand.

License to play truant

Do you skip classes? Watched a movie instead of attending a lecture? As a student, your grade was probably very much based on your exam results.

Not so when you work. Results still count, of course. Your attendance, your ability to come to work punctually now matters.

This really ties in with the flexible hours part. I agree some companies (alright, most companies) are still rigid in this area. Let me put this question to you. Can you go to work in the appointed period of time because you want to, and not because you have to?

I love my work. I love programming. Sometimes, I wake up and I can’t wait to get to work, to start on that code. I do it because I want to. It’s like playing. The standard working hours don’t really make much of a difference to me.

As usual, your ideas, thoughts and comments are most appreciated and welcome.

Enter the Entrecard

Entrecard

In line with learning the ropes of marketing this blog, I installed the BlogRush widget. There’s a major problem with the concept. To increase traffic (the aim), you need to already have some traffic (because the widget runs on page views), which increases the overall percentage of your posts being visible in the BlogRush network. Which increases your posts’ exposure on other people’s widgets. Which then might convince a visitor of theirs to visit yours. Assuming you wrote a compelling enough headline to encourage clicks.

Even though Ben’s results were bad, my results with the BlogRush widget were far more dismal. I’ve got tons of bonus credits, because I’m a smaller publisher, because I’m one of those “bloggers who most need the exposure”. I also felt pitied upon, which kinda suck. For comparison, the ratio of bonus credits to my own generated ones is on the order of about 20:1.

So I’m trying out another service, the business card 2.0 Entrecard. The “card” is basically a 125 by 125 pixel ad or representation of your blog/site. The service is free as well, and uses the concept of credits too. There are a few ways to rack up credits

  • Drop your card on other people’s Entrecard widget
  • Other people advertise on your blog (using credits)
  • “fall from the sky” credits (from contests, donation from other people)

You can find out more from the Entrecard site.

What I want to point out is how much more work you need to put in, compared to BlogRush. The BlogRush widget is an install-and-forget system. I’ve just installed the Entrecard last Friday, and my activities include

  • Approve/reject ads from advertisers
  • Process messages from other members
  • Process a recommendation for my blog (thanks Ben!)
  • Look through inbox with cards dropped by other members
  • Check out other members’ sites
  • Drop my own cards on other members’ blogs

I still haven’t done any active promoting since I want to slowly fit this into my schedule. The results seem more promising. If nothing else, I feel more involved.

You also get to learn how to handle advertisers, promote yourself and blog with ad campaigns and offer your services (in exchange for credits). The approving and rejection of ads is especially cool, even if it’s not real money. This gives you experience in moving on to a business setting, where real money is involved. Sort of like an internship.

There’s another difference between the two services. Entrecard allows you to see who else is on the system, whereas BlogRush doesn’t. In fact, for Entrecard to work effectively, you need to know who else is on the system. How else can you drop cards if you don’t know other members?

For this reason alone, there’s a community around the Entrecard system. Which encourages participation. Which increases exposure, and thus traffic.

Yet another difference, their credit systems. I’m going to use two math terms, unbounded and closed. BlogRush credits are unbounded. There’s no upper limit to the credits you can amass. You can go to your own blog, and keep clicking that browser refresh button, and you’ll keep gaining credits. If you have referral affiliates under you, you get to gain whatever credits they gain too. The percentage chance of your posts appearing on another widget is roughly
The number of credits you have / The total number of credits in system * 100

A popular blogger will have many affiliates under him, perhaps several layers down. He’ll amass tons of credits, most of it not even generated by his blog. Imagine you, the small time blogger competing for attention. Even with the bonus credits, I doubt you can create much exposure.

Anyway, the Entrecard credit system is a closed system. Every time you drop a card, you get one credit, and the other blogger gets one credit too. When you advertise on another blog, you expend twice that blogger’s average number of cards received daily.

OK, so it’s not exactly closed, mathematically speaking. But gained credits are almost all expended through some other means. Entrecard can always hold some kind of contest or one-time unique service that’ll either inject credits into the system or flush away excess credits from the system.

A tip if you want to sign up: Get a 125 by 125 pixel graphic ready first! It doesn’t have to be flashy, just something more unique than the stock graphic options provided. You can always change it later, but it’d look better if you had something unique looking first. Paint.NET does this beautifully. A quick dash of colour here, some creative use of the effects, type in your text, and you have a unique looking graphic ready to go.

Another tip if you want to uphold the standard, quality and relevancy of your blog: Don’t approve every ad directed to you! When you first sign up, you’re “cheap”. Because you’re new, the cost of advertising on your blog is 2 credits. You’ll be barraged by an onslaught of members sending in their advertisement requests, some not even related to your topic.

I regretted approving every ad. Now I’ve got to go cancel some ads…

Now for a warning. Because of the credit system, some members simply come to your blog just to drop their card. That’s it. It’s not quality traffic. There’s no reading of your posts. There’s no exploration of your blog. There’s no commenting, no interacting, nothing from these visitors.

There’s even a term created. They’re called chain droppers, because they visit one blog, drop their card, then click on whatever’s on that blog’s widget to go to the next blog, then drop their card and so on and so forth. There’s a limit of 300 credits per day amassed in this method, each credit earned for every card dropped. That doesn’t really stop them though.

From some of the articles I read, there had been talk of abandoning BlogRush in favour of Entrecard. Since I’m still new with little results to show for it, take the next tip with a pinch of salt. Use both systems. You know those chain droppers? Leverage them. How? Chain droppers visit your blog to drop their card, thereby generating a page view. Which generates a BlogRush credit, since BlogRush runs on page views.

Now you just concentrate on your Entrecard activities, and BlogRush results should improve as well. Pure genius.

Are you a bug magnet?

Do you attract programming bugs like
A moth to a flame
A fly to rubbish
A cockroach the same
An ant to food dish

Are you a code bug magnet?

Recently, I was having dinner at a pasta restaurant. Now, when I ate at (fast food) restaurants, there seemed to be these unwelcome guests. They fly and they crawl.

Who were these guests? They’re bugs. And they bug me real good.

They linger on the table and test my patience as to how close they can get to my food. They scheme to land on my drinking straw just so I have to go get another straw. My only weapons were the blow (without expectorating my food), the wave (shoo shoo), and the ignore (hope you go away…). Generally, the better restaurants have fewer of these six-legged visitations.

Anyway, back to the pasta restaurant dinner. It came to my attention how fast the waiters and waitresses move to clean up the dishes. The moment you’re done, someone comes over to you and ask “Can I clear that for you?”. Well, it’s rhetorical, because they continue to take that plate from you anyway.

Now, for comparison, there’s another restaurant I visited. As I was eating, I saw a baby cockroach crawling around. Flies I can understand. Ants I can understand. But cockroaches were the last straw. I boycotted that restaurant.

On reflection, I realised this restaurant’s helpers were slower in cleaning up tables. As a result, the unfinished food in the dirty plates and bowls naturally attracted bugs. Slow business is not an excuse to take your time keeping the place (and tables) clean.

Now here’s the point: Once the bugs come, they are hard to get rid of. Even after you clean up, they’re still there (for a while at least). It’s like they have some memory of food being there, so even if the food isn’t there now, it’ll probably be there in a while. So the bugs stick around.

Moral of the story

Once you have messy code, you attract bugs. Once the bugs are there, it’s harder to get rid of them completely. Your best bet is to not attract them in the first place, by writing good code.

Since all humans are imperfect, therefore all code written by humans are imperfect*. That said, what you can do is write good code as best as you can. Just as restaurants (and food outlets in general) inevitably attract bugs, restaurants can still keep the place clean so as to attract less of them critters.

I don’t have a good definition of “good code”, but I do know that you need help if someone asks you (in resignation), “Are you a bug magnet?”.

P.S. Lately, I tried that restaurant that was boycotted. The place seemed better kept. My dining experience improved once those exoskeleton-donning buggers were out of my face.

* To forestall your question, no, code written by computers or robots are also imperfect. Who do you think created them computers and robots in the first place?

Well-rounded coding education

Michael Barnathan asked, on my 2008 introductory article, for my thoughts on

I’m [Michael] drawing up plans for a new type of university with a multidisciplinary curriculum that takes advantage of the fusion of principles from different disciplines.

His project’s web site is at http://www.projectpolymath.org/, aiming

to simultaneously acquire breadth and depth of knowledge in time comparable to that required to obtain a traditional single-subject university degree

I think his toughest challenge is actually convincing other people that his university degree offerings are on par with, and even better than, other conventional university degrees.

That said, my eye was caught by

Rather than studying individual majors, students focus on problems and concentrate on their primary approaches to these problems.

It’s problem-centric, so other skills come into play.

Say you’re an artist and you want to paint something. Just being a brilliant creative person isn’t enough. Do you want to use a particular type of brush? Do you know how to mix colours together to get that special hue and tone? Do you care about the quality of your painting canvas?

Joel Spolsky says there should be a degree program where it would

consist of a practical studio requirement developing significant works of software on teams with very experienced teachers, with a sprinkling of liberal arts classes for balance.

where

You might be able to major in Game Development and work on a significant game title, for example, and that’s how you spend most of your time, just like a film student spends a lot of time actually making films and the dance students spend most of their time dancing.

It’s similar to Michael’s idea of education. The other areas of your education enhance your primary focus. Just browse through some game development sites such as GameDev and MadMonkey. You’ll find many articles on game development that have little to do with coding itself, ranging from application of artificial intelligence to the physics in cloth simulation. And here you thought game developers were all about coding skills…

Then there’s Clayton Shier who wrote about the importance of math in computer science courses, of knowing a subject outside of programming.

And Bryan Hughes said that

Coding is actually a small part of the real software engineering package.

on a forum post discussing recognisable traits of a good programmer (look for Nova Dragoon near the end of the post).

Not convinced yet? Jeff Atwood talks about how we should teach computer science, with subjects such as project deployment and source control. Topics that have little to do with coding itself, yet make you a better programmer. There’s something important he mentioned too:

Today’s computer science students should develop software under conditions as close as possible to the real world, or the best available approximation thereof.

It’s something that on hindsight, I should have paid more attention to. In the academic environment,

  • I worked mostly alone (no people skills training for working in teams)
  • Collaboration was frowned upon (they think of it as copying or cheating)
  • Source control was non-existent (still is in my present employment…)
  • Deployment was non-existent (instructor/professor simply compiled your code and ran it)
  • Mostly theoretical or well-defined problems were given (real world problems are much more complicated, usually people-based)

The usual problems fall into topics like finding shortest path with Dijkstra, drawing the Sierpinski Triangle, or manipulating huge matrices for LU decomposition or QR decomposition (killed lots of brain cells too because of the math involved…).

During my university education, there was only 1 semester where I attended a specific course on programming, with C. Half my time was on math. The other half was on solving scientific problems with programming, using the knowledge I had on that one course in that one semester.

When I started working as a programmer, there were lots of programming stuff I needed to do and learn. Like SQL, VB.NET and Javascript. There were also a lot of non-programming stuff. Like writing documentation, talking with users and working with other team members.

Being a good programmer is more than just coding.

And that’s the point. That’s the whole point of this blog. Now, isn’t it time for you to get a well-rounded coding education?