Sunday, 19 November 2017

Film Review: The Girl With The Dragon Tattoo (2011) (Part 1/2)

Earlier this year, I provided a film review of The Girl With The Dragon Tattoo. Today will be more of the same, only it's a review of the American remake, released in 2011. Now, the thing about Hollywood remakes of foreign films is that they usually have better production values, but little else. We'll take a look at this film, and its 2009 incarnation, and compare them side by side.

Warning - nudity, violence

As with its predecessor, this film doesn't shy away with portraying sex  and violence; particularly violence towards women which is arguably the crux of the story. Does it, however, offer anything new? Let's find out.

I don't own any of the screenshots.


The American remake of The Girl With The Dragon Tattoo is not too hard to watch, though if you've watched the 2009 version and/or read the novel, you might be inclined to be critical.

The Premise

Refer to the last review of this film and the review of the novel. Almost word for word, the storyline is the same. There are certain places where the script for this movie more closely matches the novel, than the Swedish version's take.

The Characters

Daniel Craig, star of the James Bond movies, is the journalist Mikael Blomkvist. Intense gazes notwithstanding, he doesn't strike me as a Blomkvist. I'm thinking the producers chose poorly for this role.

Rooney Mara as the computer hacker Lisbeth Salander. Recently saw her in Pan. She's cold and aloof, as might be expected, but she's also emotionally vulnerable and somehow fragile. This is in stark contrast to the scenes where she lets loose, and this somehow makes it even more terrifying.

Christopher Plummer plays Henrik Vanger. He reminds me a little of Sir Ian McKellan as Magneto. Way more energetic than I'd have expected from a character like Henrik Vanger, but no less shrewd.

Yorick van Wageningen tries not to ham it up as the creepy and despicable Nils Bjurman... and just barely succeeds. The result is a rather wimpy Bjurman, though the rape and torture scenes are no less brutal for it.

Stellan Skarsgård is Martin Vanger. I last saw the guy in the Exorcist: The Beginning and Thor, and damn he is superb here. Just affable enough to seem harmless but shrewd enough to run a company. And when he finally reveals his true colors, you'll see a performance you won't forget. Mesmerizing as a snake, and totally pleasant even as he's explaining just how close you are to being murdered in cold blood. He also happens to be the only Swedish actor among the main cast.

Steven Berkoff as Dirch Frode. It's a very one-note performance here and xxx does not look really comfortable in the role. Half the time he looks constipated.

Robin Wright as Erika Berger. I like watching Robin Wright, but here she manages to be even more inconsequential than the last Erika Berger, played by Lena Endre.

Tony Way is Plague, Lisbeth's computer geek associate and occasional partner-in-crime. His brief portrayal didn't do it for me. Could be due to a very limited script, but the interaction with Lisbeth felt off.

Geraldine James as Cecelia Vanger. Pretty, but nothing noteworthy here. Colder and more brusque than the 2009 incarnation.

Joely Richardson makes a late but welcome appearance as Harriet Vanger. I wondered where I'd seen this face before, and was flabbergasted to realize it was in one of my all-time favorite flicks The Patriot, where she was this hot bodacious babe in a sinfully tight Victorian dress. Holy shit, that was eighteen years ago!

Josefin Asplund plays Mikael's daughter Pernilla. Typical teenager fare here, but she serves as an important plot device.

Goran Višnjić is Dragan Armansky. We only see him in a few scenes and the actor has very little to do other than put on an authoritative air as boss of Milton Security. A thankless role.

Élodie Yung as Lisbeth's on-off lover Miriam Wu. I've seen her in Gods of Egypt last year, The Hitman's Bodyguard this year and more recently, in the Daredevil and The Defenders series as Elektra. She actually went topless for this bit part, so it must have been one of her earlier roles.

Bengt C.W. Carlsson as Palmer Holmgren. Mostly a non-speaking (and almost non-moving) role, due to the character suffering a stroke.

The Mood

Cold and dark. Literally, because a large part of the movie takes pace in winter. Most of the scenery is really pretty, what with the snowbound landscapes and all. And the use of music and cut-scenes to ratchet up the tension when it's warranted... top-class.

What I liked



The opening credits. So creepy. A melting-pot of morphy special effects. And that music.

Lisbeth stands by casually as a woman enters the 4-digit passcode to a secured apartment building, and just seconds later, produces the same passcode by sound alone. Nothing's safe from this hacker.


In some ways, the 2011 remake is more thorough with the details. They even included the cat that was mutilated!

This fight scene between Lisbeth and a would-be snatch thief on the escalator in a subway. Not so much the slick action, but here we see Lisbeth unleash her frustration, and it is terrifying.


This close-up shot of the cheque Bjurman cuts Lisbeth after raping her. Somehow it just slams the message home so much more brutally than the obligatory post-rape shower scene.


This shot of Lisbeth hacking into Wennerström's email made me laugh out loud.


"Do you doubt anything I've said? Do you doubt what's in the reports that have followed me around all my life? What do they say? If you had to sum it up, they say I'm insane. No, it's OK, you can nod because it's true. I am insane."

Holy crap, Rooney Mara delivers this in the most chilling manner ever.


This t-shirt Lisbeth is wearing during the classic scene where she and Mikael finally meet.


I really, really enjoyed the torture scene near the end. Martin Vanger even has some ridiculously upbeat music playing as he's planning to gut Mikael like a fish.

What I didn't

Generally, the entire film still boasted the same Swedish names and locations in the book - but everything was said in English. Which is pretty jarring.


The words tattooed by Lisbeth on Bjurman are in English, and the message has been truncated from the novel. I guess it's one of those little tradeoffs you have to make when you're trying to do an American remake of a Swedish original.

The sex scene between Lisbeth and Mikael felt even more abrupt and forced than it did in the film's predecessor. Nice angles, though.

The rest of the film isn't compelling enough to watch. After the entire Martin Vanger sequence, putting Lisbeth through the motions of outing Wennerström is faithful to the novel, but really very anti-climatic.

Conclusion

The 2011 remake is a decent piece of film-making, but unfortunately it will always be compared against the merits of its predecessor. And safe to say, there are plenty of instances where it falls short. Still, it's a slickly produced piece of film and does justice to the novel. Lisbeth Salander will probably be one of the roles Rooney Mara is forever remembered for.

My Rating

6.5 / 10

Next

A comparison of the 2009 version and this one. Which one comes out ahead, and in what areas?

Friday, 10 November 2017

Web Tutorial: Ruby Mad Libs

Hey, y'all.

Ever heard of this game called Mad Libs? You supply a list of words and the players make a story out of them. Most of the time, the results are so whacky, it's funny.

If you enjoyed playing that, you're in luck because we're going to make our very own Mad Libs game. For that, we'll be using Ruby. QBasic will do, too, in a pinch, but Ruby makes it easier by having hash features and string substitution similar to C. So if you've got Ruby installed, create your program file and let's get cracking!

First, we do this. As you may have surmised, this prints a nice introductory text on the screen.
puts "Welcome to TeochewThunder's Mad Libs!"


Next, we're going to introduce a Do-While loop. In Ruby, it's expressed as such. Here, we have a variable, continue, which is set to an empty string. And the program continues for eternity until a certain condition is met. In this case, that's when continue has a value of "Y" or "y". Y, you ask? (heh heh) Well, read on...
puts "Welcome to TeochewThunder's Mad Libs!"

continue = ""
begin

end while continue == "Y" or continue == "y"


Because, within the loop, we print a string asking if the user wishes to continue, then use a gets statement to assign user input to the variable continue. So if the user enters anything else but "Y" or "y", the program ends.
puts "Welcome to TeochewThunder's Mad Libs!"

continue = ""
begin
    puts "Do you wish to continue? (Y/N)"
    continue = gets
end while continue == "Y" or continue == "y"


Try it. Does it work? I bet the program exits no matter what!


That's because if you typed in "Y" or "y" as input and then pressed the Enter key, the input gets captured as "Y\n" or "y\n". Yes, even the Enter key counts as input! Seems silly, doesn't it? But fret not, there's an easy way out. Just chomp the end off, and your input will be correct.
begin
    puts "Do you wish to continue? (Y/N)"
    continue = gets.chomp
end while continue == "Y" or continue == "y"


Try it again. "Y" or "y" should cause the program to keep running!


Now, within the loop, let's set the variable content by calling a function, getMadLibContent()... and create that function right at the beginning of your code.
def getMadLibContent()

end

puts "Welcome to TeochewThunder's Mad Libs!"

continue = ""
begin
    content = getMadLibContent()

    puts "Do you wish to continue? (Y/N)"
    continue = gets.chomp
end while continue == "Y" or continue == "y"


This function should return a hash object. First, let's define an array, contentTypes.
def getMadLibContent()
    contentTypes = [ ]
end


Each array element is a hash object, containing they key story, which points to a string, and words, which points to another array.
def getMadLibContent()
    contentTypes = [
            {
                "story" => "",
                "words" => [ ]
            },
    ]
end


Here, we define the story, using "%s" where we expect words to be substituted.
def getMadLibContent()
    contentTypes = [
            {
                "story" => "While eating %s, I %s took up my %s and placed it under my %s. It %s %s.",
                "words" => [ ]
            },
    ]
end


Next, we make an array of the kind of words we want to substitute into the placeholders provided by "%s". Bear in mind that they have to be in order.
def getMadLibContent()
    contentTypes = [
            {
                "story" => "While eating %s, I %s took up my %s and placed it under my %s. It %s %s.",
                "words" => [
                    "food (e.g, pie, noodles, shortcake)",
                    "adverb (e.g, happily, carefully, quickly)",
                    "noun (e.g, hammer, balloon, cigar)",
                    "item of clothing (e.g, hat, shoe, coat)",
                    "past action (e.g, shouted, ran, floated)",
                    "adverb (e.g, happily, carefully, quickly)"
                ]
            },
    ]
end


Make two more! Get creative!
def getMadLibContent()
    contentTypes = [
            {
                "story" => "While eating %s, I %s took up my %s and placed it under my %s. It %s %s.",
                "words" => [
                    "food (e.g, pie, noodles, shortcake)",
                    "adverb (e.g, happily, carefully, quickly)",
                    "noun (e.g, hammer, balloon, cigar)",
                    "item of clothing (e.g, hat, shoe, coat)",
                    "past action (e.g, shouted, ran, floated)",
                    "adverb (e.g, happily, carefully, quickly)"
                ]
            },
            {
                "story" => "She bought a %s %s and started %s it as it %s. It felt %s to do so, and she continued %s.",
                "words" => [
                    "descriptive (e.g, blue, glad, large)",
                    "furniture (e.g, table, stool, cupboard)",
                    "active action (e.g, running, eating, fighting)",
                    "past action (e.g, shouted, ran, floated)",
                    "descriptive (e.g, blue, glad, large)",
                    "active action (e.g, running, eating, fighting)"
                ]   
            },
            {
                "story" => "His %s was a %s %s and %s %s like a %s. He would try to %s, but this would result in %s %s.",
                "words" => [
                    "relative (e.g, father, son, cousin)",
                    "descriptive (e.g, blue, glad, large)",
                    "noun (e.g, hammer, balloon, cigar)",
                    "adverb (e.g, happily, carefully, quickly)",
                    "past action (e.g, shouted, ran, floated)",
                    "animal (e.g, goldfish, mouse, lion)",
                    "action (e.g, think, stand, kick)",
                    "people (e.g, men, gardeners, mechanics)",
                    "active action (e.g, running, eating, fighting)"
                ]   
            },
    ]
end


OK, that's enough content to start with. You want there to be an element of surprise, so generate a random number and assign the value to the variable scenario, using the rand() function and passing in the length of the contentTypes array as an argument, which is 3. This will net you a random number from 0 to 2. Then create a variable, madlibcontent, and set it to the value of the array element in contentTypes pointed to by scenario. You don't have to explicitly type a return statement at this point, because Ruby functions automatically return the last expression in the function.
def getMadLibContent()
    contentTypes = [
            {
                "story" => "While eating %s, I %s took up my %s and placed it under my %s. It %s %s.",
                "words" => [
                    "food (e.g, pie, noodles, shortcake)",
                    "adverb (e.g, happily, carefully, quickly)",
                    "noun (e.g, hammer, balloon, cigar)",
                    "item of clothing (e.g, hat, shoe, coat)",
                    "past action (e.g, shouted, ran, floated)",
                    "adverb (e.g, happily, carefully, quickly)"
                ]
            },
            {
                "story" => "She bought a %s %s and started %s it as it %s. It felt %s to do so, and she continued %s.",
                "words" => [
                    "descriptive (e.g, blue, glad, large)",
                    "furniture (e.g, table, stool, cupboard)",
                    "active action (e.g, running, eating, fighting)",
                    "past action (e.g, shouted, ran, floated)",
                    "descriptive (e.g, blue, glad, large)",
                    "active action (e.g, running, eating, fighting)"
                ]   
            },
            {
                "story" => "His %s was a %s %s and %s %s like a %s. He would try to %s, but this would result in %s %s.",
                "words" => [
                    "relative (e.g, father, son, cousin)",
                    "descriptive (e.g, blue, glad, large)",
                    "noun (e.g, hammer, balloon, cigar)",
                    "adverb (e.g, happily, carefully, quickly)",
                    "past action (e.g, shouted, ran, floated)",
                    "animal (e.g, goldfish, mouse, lion)",
                    "action (e.g, think, stand, kick)",
                    "people (e.g, men, gardeners, mechanics)",
                    "active action (e.g, running, eating, fighting)"
                ]   
            },
    ]

    scenario = rand(contentTypes.length)
    madlibcontent = contentTypes[scenario]
end


Now, in your loop, content should be the hash object you got from the function getMadLibContent(). Create a variable, userProvided and set it to store an array that has the same length as the words array in the content hash object.
continue = ""
begin
    content = getMadLibContent()
    userProvided = Array.new(content['words'].length)

    puts "Do you wish to continue? (Y/N)"
    continue = gets.chomp
end while continue == "Y" or continue == "y"


Then iterate through the words array using a For loop.
continue = ""
begin
    content = getMadLibContent()
    userProvided = Array.new(content['words'].length)
    for i in 0..content['words'].length-1

    end

    puts "Do you wish to continue? (Y/N)"
    continue = gets.chomp
end while continue == "Y" or continue == "y"


In the For loop, print a statement asking the user to enter a word or phrase, then print the clue provided by the appropriate element in the words array. And obtain user input using gets again. Don't forget to chomp! Assign the input to the corresponding element in the userProvided array.
continue = ""
begin
    content = getMadLibContent()
    userProvided = Array.new(content['words'].length)
    for i in 0..content['words'].length-1
        puts "Please enter a word or phrase:"
        puts content['words'][i]

        userProvided[i] = gets.chomp   
    end

    puts "Do you wish to continue? (Y/N)"
    continue = gets.chomp
end while continue == "Y" or continue == "y"


So far so good, yeah?


Now it's time to tell the story! Use the puts statement to print out the story string from the content hash object.
continue = ""
begin
    content = getMadLibContent()
    userProvided = Array.new(content['words'].length)
    for i in 0..content['words'].length-1
        puts "Please enter a word or phrase:"
        puts content['words'][i]

        userProvided[i] = gets.chomp   
    end

    puts "Here is your story:"
    puts content['story']

    puts "Do you wish to continue? (Y/N)"
    continue = gets.chomp
end while continue == "Y" or continue == "y"


Try it! Oh dear, not really what you wanted!


Use this statement instead, followed by a "%" and a test array.
puts content['story'] % ["test1","test2"]


See? You get an error because there are more instances of "%s" than there are elements in the array you provided. But how would we know how many instances of "%s" to replace, and what to replace them with?


Use the userProvided array instead. This will substitute all instances of "%s" with the appropriate element from the userProvided array!
puts content['story'] % userProvided


Try it again. There's your story!




This is really just a simple programming exercise that I'm using as an initial foray into Ruby. I'm really digging it so far.

I'll leave you to %s your %s. Have %s fun!
T___T

Sunday, 5 November 2017

Ruminations of a 40-year old Geek

Lordy, Lordy, look who's forty!

Yep, that one was plagiarized from Silicon Valley Season 4, but it seems particularly apt.

His Teochewness turns 40 today, and would like to expound on a very pertinent topic in the tech industry - aging. Or rather, aging developers. If I told you I didn't feel the effects, that would be a big fat lie. I didn't become an old fart overnight - these effects have been creeping up over the past few years.

Overall Health

For the longest time since 2008, I had not been taking sick leave. I'd been running on a heady mixture of sunlight, cigarettes and Teochew arrogance. That record was broken last year, and this year. That's two times in two years after a period of eight years. The illusion that I'm made of iron is long gone, and I feel just as fragile as every other schmuck on this planet.

My joints are stiff. My teeth feel weak. If I sit too long, my legs fall asleep and my back and neck start to whine. My cholesterol level is ambitiously scaling new heights, and my digestive system just isn't what it used to be. Come to think of it, my appetite isn't what it used to be. Buffets? Forget it, sunshine.

And I'm not even going to go into detail about the severe discomfort that occurs whenever it gets cold.

Yeah bro,
it's like that.

On the bright side, I look pretty good without my clothes on. Pretty good for a 40-year-old, that is. This ain't no Manhunt torso, but damn if it isn't finer than what the average 30-year-old has to offer. Too bad looking good is just about the only thing this aging body does well these days. Seriously, what's the point of having abs if your stomach can't digest the sinfully greasy and spicy stuff without complaining? Or having nicely toned legs if your goddamn knees creak every time you walk too fast?

Oh, you think I might be exaggerating just a wee bit? We'll talk again when you turn 40.


Fatigue

Another thing about getting to this age, is decreasing energy levels. I get tired a lot more easily than I used to, and it shows. And with this development, changes to the lifestyle are in order.

Energy levels: down.

No more late nights out. You want to spent all night drinking beer and reminiscing? Sorry buddy, you're out of luck. Don't call after 10pm, I ain't picking up. Even an wrinkled old bastard like me needs his beauty sleep.

Vastly reduced overtime in the office. I get my shit done, and leave. Around 6pm, my concentration drops off noticeably and it's all I can do to keep my eyes open. That's a stark contrast to five years ago, when I was still pulling twelve-hour workdays and getting in the office on weekends and public holidays. Now if I stay back and keep working past 7pm, the first thing I'm gonna be doing next morning is undoing all the shit code I wrote last evening. That helps no one.

No more outside projects. These used to be ways to supplement my miserable income, but lately I've been declining all offers. While anti-moonlighting clauses are a staple in almost all employment contracts, they're almost impossible to enforce with freelance projects. But freelance projects take - you guessed it - energy. Energy I don't have. The fact that my income is no longer miserable (maybe even excessive now) doesn't hurt.

And especially - no more losing my temper. Sure, I still get annoyed from time to time. But explosive bursts of angst are a thing of the past now. People say this is due to maturity. A sign of me staying above it all.

If only.

No, this is due to a dwindling supply of energy, and when you're dealing with a limited supply of anything, you tend to want to make it count. That means no more unproductive energy-sapping activities like flame wars, Internet arguments or even offline arguments. It's not even like reacting to some idiot on Social Media would make me feel tired - just thinking about reacting to some idiot on Social Media already makes me feel tired. These days, I'm more than likely to simply agree just so the other party can shut up. Hey, so somebody stays ignorant. So be it. Ain't my job to educate the world. Life's short, and for people like me, it just got a whole lot shorter.

Dude, I'm 40 and statistically, I have another 20 years left, 30 if I'm lucky. If you think I'm going to waste any of it on a pissing contest with some pimply teenage wanker on Social Media, think again.

Attitude

There was a time I felt driven to prove my worth as a professional web developer. Those days are over. It's not so much complacency; instead, it's more about acceptance. I accept that I'm not some hotshot that can walk into any tech firm and instantly land a job. In fact, I'm probably not even in the bottom 25 percentile of tech minds on this island. This isn't humility, either. Again, it's acceptance.

I'm also a lot more zen about underachieving these days. Succeed or fail, life goes on. And if you disagree, feel free to shoot yourself in the head next time you fall short. I'll help document your dramatic gesture on YouTube.


You failed? Die, loser.

Try not giving a shit. It's surprisingly empowering. People are vain, hypocritical, and put a ridiculous amount of effort into projecting some kind of image to the world. This 40-year old dev has neither the time nor the inclination. Being insecure makes you open to manipulation. Fuck all of that.

Surprisingly, though, there are some things I've come to care about more, instead of less. Aging could be making me less gung-ho... or I could be mellowing. What a scary thought. At work, I'm seeing thirtysomethings just as aggressive and driven as I was years ago. And unfortunately, just as stupid about it.

Where I once only cared about getting shit done come hell or high water, getting shit done right has come to matter just as much, if not more. "But it works!" is the layperson's excuse. Guess what - I no longer work for laypeople and therefore, no longer have the luxury of that excuse. Any idiot can write working code - now I have to hold myself to higher standards.

Where I once saw office punctuality as a crutch for people who don't have anything meaningful to contribute, I now see it as a mark of reliability - as in, people can generally count on you to be available in the office by 9pm, not a minute later. Being on time now matters more than staying back in the office or working on weekends. Being reliable has become more important than being the superstar workhorse.

Where I once prided myself on the number of different languages and platforms I've done stuff in, I've come to value team skills more. Communication, usage of code repositories, writing clean readable code. I'm no longer that 30 year old cowboy cop developer, but rather, part of a unit. Besides, very few companies need a developer who's coded in ten different languages - but every company likes their devs to be good at communication and teamwork.



In a wrinkled nutshell (God, that sounds gross)

There's so much you lose as you age. Thankfully, hanging out with younger people helps realize how much I've gained, and hanging out with older people have helped me realized how much I've still got going for me. Perspective - it's underrated.

Many senior regards,
T___T

Sunday, 8 October 2017

TeochewThunder: Year Three (Part 2/2)

As with previous years, some of my posts garnered more... attention than others. The trends have been a little strange, to be honest. On the bright side, readership has gone up. Not phenomenally, but noticeably.

What can I say? Fuck yeah.

These trends!

TeochewThunder's content

Tech News - 2017 has been undeniably the Year of the Trump. The politics of USA be damned, the ramifications of his Presidency has shaken the world - all the way to the tech industry, which in principle, should be free of such things. But no, the ongoing war between the Left and the Right has been fought on many levels, much of it on Social Media. Consequently, it's spawned a few posts ruminating on this phenomenon, such as The Misinformation Age, Shopify Stands Steady and more recently, James and the Giant Echo Chamber and A Storm Without A Cloud. Even posts that don't have anything to directly to do with US politics, have references to it peppered here and there. Everywhere I go, there's no escape from Trump, his critics and US politics. Even in tech forums, where I visit to obtain some illumination on code issues, there are the assclowns apologizing for having inflicted Trump on the world. It's bad enough that I have to contend with posts tirelessly raging about Trump or Clinton on my Facebook or Quora feed (thank God I don't have a Twitter account... yet) but on tech forums? Come on, you idiots. Find a safe space and park your buttery asses there. Don't bring that shit into tech!

Ironically, one of the pieces that got the most views was not about the US, but about Singapore. I'm not sure what made Singapore's cyber-defense initiative so interesting, but there you go. Coming a close second was No-show Nodevember, in which I provided my thoughts on Douglas Crockford's exclusion from Nodevember. Again, I'm not sure I understand why this particular piece would hold so much more interest to my readers. Food for thought, eh?

Reviews - This year was also a year of many firsts, at least where Reviews are concerned. The first ever Fiction Review. The first ever non-gaming App Review. The first multi-part review of any kind, namely a Fiction Review and Film Review of The Millennium Series. My repertoire is expanding!

In fact, this year has been pretty heavy on the reviews. Hope no one's complaining!

Web Tutorials - Compared to last year's offerings, this year's web tutorials are a lot less complex, and more varied in nature. Less of the HTML/CSS/JavaScript special effects jazz and more on other platforms, security, and so on. Because variety is the spice of life, and I do like to play with new stuff. It keeps things fun. Also, even the average web developer does not need to know only HTML/CSS and JavaScript. A whole lot of separate components goes into the building of a website or web application. And knowledge of these things, if not expertise, is key.

I like to think the quality of my JavaScript has improved somewhat. Not that most people would notice because traditionally, to my chagrin, web tutorials don't get as many eyeballs as the rest. I work pretty hard on those, dammit!

Miscellaneous content - A fluff piece I wrote on my friend's wedding in the Apple Store was an instant hit despite it basically being rehashed information from a variety of news sites. Other than that, it's mostly very technical stuff that keeps me riveted but bores the living shit out of everyone else.

Some stuff, like Cracking the QBasic Color Code, is not exactly current. I wrote that post ages ago, but never found the time to release it until now. That's also because I have a certain limit I like to observe in blog posts - maximum nine per month. And even that is pushing it. Sometimes tech news gets in the way, and takes priority. So that blog post kept getting pushed into my backlog until last month. Hey, it's not like anybody cares - it's QBasic!

One standout though, is this piece which I wrote last month, a few thoughts on my experience in Singapore Polytechnic. I didn't think it was all that impressive, but someone shared it and the hits started coming. At the time of this writing, it's my most-viewed blogpost to date. I kid you not.


All this writing is hard work.

General writing style

Call it fatigue, but I think the quality of my signature puns has deteriorated. Some days it feels like I'm trying just a little too hard.

I'm also trying to write fewer words. Communicate more with less. It's an ongoing struggle with me because I really tend to pile it on when trying to bring the point across.

Thankfully, my practice of publishing content at least a week after writing it, has worked favorably. There are times when I get carried away trying to present all sides of an issue, or adequately express how strongly I feel about any given issue, and the words chosen are less than ideal. Taking a week to review said content goes a long way in increasing the clarity of the message, reducing clutter and getting the focus just right. Hopefully, I've done better since last year.

That's it!

This concludes the year end report for TeochewThunder. See you again next October. There will be a break for the rest of this month, and posting will resume in November.

Word, yo.
T___T

Thursday, 5 October 2017

TeochewThunder: Year Three (Part 1/2)

Three years.

Three years from the day I finally stopped farting around and just did it - started this blog, set up my website, put myself out there. And every time I put up an anniversary post, I have to thank, of course, Catherine Ling of Caremburu, who got me started on this path. It was then or never. No point waiting till I had enough tech cred. That was how I got tech cred.

Take the plunge!

I wish I could declare it's succeeded beyond my wildest dreams, but let's be real here. This is one tech blog out of millions of tech blogs out there, and it's not even a particularly good one. I'm nobody. Nothing. Zilch. Nada. And that's a good thing because that means nobody cares about what I have to say. In this day and age, caring leads to witch hunts and the end of your private life as you know it.

No, success takes many forms, and in my case, this blog succeeded not once, but twice.

The first time was back in 2016, when the owner of a software startup hired me - after viewing my posts, GitHub account and other things I had shared online.

The second time was earlier this year, when a major tech company interviewed me and commented on my blog during the interview. And then hired me.

In both cases, one could argue that I'd passed the technical interview and was therefore qualified, and my crappy little blog had nothing to do with it at all. Anyone who says that obviously does not understand the industry. Passing a technical interview is the minimum requirement. What a hiring manager looks for is that little extra. Love for your craft. Enthusiasm. And for a web developer, nothing screams enthusiasm like a tech blog, buying your own domain name and a lovingly maintained repository filled with all the code you write after work hours.

Coding after hours.

You see, when hiring a developer at my level, what an employer looks for is return on investment. Let's define quality of a developer as the knowledge he possesses (x) against the entirety of technical knowledge that exists out there right now (y). Someone who loves his work is only going to get better, no matter how much he sucked when you first hired him. Conversely, if you hire someone who checks all the right boxes but fails to convince you that he loves his work enough to keep improving, his value will inevitably go down the moment you hire him. x will be at a standstill, while y is only going to increase.

Also, one could say that in this day and age, not having an online presence is weird. That goes doubly if you're a tech. Triply if you're a web tech.

It's not about the quality of the content. My posts don't boast any stunning insights about the web industry or tech news. They do, however, tell the prospective employer that I bother to keep myself informed. I think about the things I read, and I care enough to formulate an opinion and put it out there. Same for my code. It's not the greatest code in the world. You could take a look and declare that your dog could write better code. Again, it's not about the quality. It's about the amount of love you put into it.

No, I put myself out there, and in an industry where many developers can't even be bothered, that puts me ahead of the pack - a pack that includes developers three times more experienced and proficient than I am. I could be drinking myself silly at a pub after hours. I could be binge-watching TV. Engaging in internet flame wars. Or any other enjoyable but arguably time-wasting activity. Instead, I'm doing this.

Well, that goes for my yearly exercise in defending the existence of this blog...

Next

Let's analyze the greatest hits of 2017!