Monday 28 June 2021

2020 - Three Jobs In a Year (Part 3/3)

The day of my next performance review arrived. However, in the morning, the was a bit of a hullabaloo over something I can't quite remember, and I asked a question. His reply was public, and scathing.

"Stop asking stupid questions, it doesn't help."

This raised an eyebrow. This guy wasn't even pretending to be nice anymore. He sure wasn't holding back. Fine. He wanted to play this game? Confidence bolstered by knowledge of my finances and my eventual plan to leave, I was more than willing to oblige. I held my peace, biding my time till the time for the performance review came.

HR was in the call, and before my CTO arrived, she told me that he could be a little high strung and come across as curt at times, leading me to suspect that this wasn't the first time he had rubbed someone the wrong way. However, she assured me that my CTO was "not a malicious person". I don't think the lady actually understood the problem. It wasn't malice. I had never considered my CTO to be a malicious person. My problem with him was that for a dude in his mid-thirties, he had the emotional control of a teenager.

Then my CTO arrived in the call. He started off by saying that while he had noted some improvement in my performance, he still wasn't confident in my ability to work in the company and he would continue to keep monitoring. He brought up certain concerns such as my perceived slowness in replying in the Slack chat, and actively encouraged me to "defend" myself against his accusations. I was amused at this. This guy wanted a fight? He had no idea what was coming.

It was my turn to talk. Here, I applied the Sandwich Method that I had learned during my ACTA days - start with something nice before saying something negative. I led with how much fun I'd had in these six months compared to the last three years at the previous, much larger company, which was the truth. The variety of tasks assigned to me had made things a lot more interesting. He seemed to be tickled pink by this.

Time for the stick.

And then it was time to give him the stick. The guy never suspected what he was walking into.

I began voicing my concerns, like how the things like code cleanliness and organization that he kept saying he valued and were missing in my work, just weren't present in the existing code base either. It was a huge mess, with me having to fix problems that had existed for years. Like the recent Cross-site Scripting vulnerability issues, that I'd already brought up in my first few weeks at work. I had thought it was bad; now that I stepped up my game (as he had wanted me to do) and actually started proactively looking for ways to improve the code base, it was worse than I initially thought. I stopped short of saying his code base was garbage, but the implication was clear: I blamed the tech leadership. Honestly, I figured that since this guy enjoyed pointing fingers so much, he wouldn't mind receiving some of the same. Seems fair, right?

Nope!

In a nutshell, he blew the fuck up. Accused me of trying to turn this performance review around on him, and questioning why I chose to bring it up now rather than during Tech meetings. He told me I should be more careful with my words (rich coming from him, really) and yes he was doing a bad job which was precisely why he needed people like me to step up. As he raged, HR had to step in and try to smooth things over.

On my part, as I calmly sat there and smoked a cigarette, listening to his raving through the computer screen and HR trying to stop him before he went too far, I couldn't help feeling unbelievably smug. This had turned out better than I had anticipated. My original intention had been to gently point out that the existing code base was every bit as crappy as his opinion of my work, and that he should maybe assume some responsibility being the CTO and all. Instead, he had chomped down on the bait like an idiot, and his little meltdown in front of HR was showing exactly what I thought: this guy was a loose cannon.

Aw, poor baby. I think I hurt his feelings.

Some of you may be asking; what did I hope to gain from this? Well, nothing at all. I understood that he had all the power in this contest of wills. But I had absolutely nothing to lose here; mentally I had already checked out and was prepared to be fired on the spot.

More importantly, my point had been made, and I hope it wasn't lost on him. All those times he had been putting me down in front of the entire team, he had forgotten one thing: I was a no-name web developer with no reputation to hurt. He, on the other hand, was the CTO and co-founder of the company. Should I ever decide to actually stop holding back, I could do a lot more damage to him than he could ever do to me. This was merely a scaled-down demonstration on my part; I had humiliated him in front of HR rather than the entire Tech Department. Actually, scratch that - I had exploited his weakness and caused him to humiliate himself. After all, regardless of the critical content of my message, I had unfailingly been polite and professional.

He had been punching down constantly. But once I started punching back after six months of taking his shit, I made sure it fucking hurt.

I was smiling the rest of the day, after the review ended. It later struck me that I hadn't had the opportunity to apply the last piece of the Sandwich Method as originally planned. HR had ended the meeting in a hurry.

In hindsight, though, I recognize that what I did to my own CTO is nothing to be proud of. No matter what a childish asshole he had been, I had allowed myself to be dragged down to that level.

Shit, I was supposed to be better than that. What had I become?

I'm not sorry it happened to him, because he pretty much had it coming. But I'm sorry it had to be me who did it. I've always prided myself on being above this sort of thing. This incident had shown me that when push comes to shove, I'm as capable of petty cruelty as anyone else. Hopefully, going forward, this does not become a pattern. It would make me a truly frightening employee to hire. Most people think that the revenge of a disgruntled tech geek is to hack databases and destroy code bases. No, what I had done was far more insidious... and legal to boot.

Getting the axe

And then it happened. One Thursday evening, he messaged me on Slack to berate me about yet another mistake I'd made, and admittedly it was a sizeable one. He told me to fix it by morning, and I actually made an honest attempt to do so.

In the morning, out of the blue, the DevOps Engineer sent me a message on Slack. As I no longer have access to that conversation, I can only recreate it from memory.

Him: I'm so sorry to hear what happened, and I just want you to know I had nothing to do with his decision and hope you find something soon.
Me: Oh, am I getting fired?
Him: Oh fuck, you didn't get the email?


Well, there you go. I wasn't sure I could look down on my CTO even more at this point, but kudos to him, he certainly was making a case for it. Not only had he fired me via email (what a spineless move - even the last guy to do it back in 2011 had extended me the professional courtesy of doing it face-to-face), he'd screwed even that up by sending it to multiple people... except me.

The charitable interpretation is that the CTO had finally had enough of me making mistakes and decided to just put me out of my misery instead of dragging out the probation process any longer than he already had. The cynical interpretation is, well, I'd finally given him a plausible excuse to do what he was itching to do.

I received the email in question, after the CTO re-sent it. The first two lines went along the lines of "your contract has been terminated as of September 11, 2020" and I didn't really bother to read the rest. I mean, I did scan the contents of the following paragraphs, all pertaining to how I failed as an employee, in cringey broken English to boot. But it was ultimately unimportant. The most relevant lines were the first two. There was only one thought running through my mind.

Saved by the axe.

I was free. Free of this douchebag and his appalling behavior.

The first thing I did was to inform my family, and my soon-to-be ex-colleagues. And then I took a nice long coffee break. Rather than mull over the fact that I had effectively just been fired, I was actually more tickled by the fact that it had happened on September 11th.

Aftermath

Sure, this was a stressful six months. But I have really very little to complain about. Swear to God, I've had worse.

After all, however unpleasant I found my experience with the CTO to be, I did absorb whatever lessons I could. I picked up new tools, new techniques, and got to apply some stuff that, up to this point, had been little more than a hobby. I collected yet another interesting war story to add to my ever-growing collection. And I got paid for it.

On the CTO's side, if my work was really as useless as he claimed it to be; well then, I guess some poor sucker just paid me six months to deliver jackshit, didn't he? It could just be me being a hopeless optimist and overly determined to seek out that silver lining, but I honestly don't see myself as the loser in all this.

The silver lining

I may have failed to hold on to the job, but my failure was professional. I had merely failed to meet my CTO's technical expectations. His failure was far more spectacular - he had failed to meet my expectations of emotional maturity. He had failed as a person. The company had gotten rid of an underperforming dev, but it had retained a far larger problem - someone in a position of authority who simply did not have the correct temperament.

Landing that next job

The next two weeks were pure bliss. I swam every day. I wrote code, practised on my new MacBook Air and played games on my phone, all the while applying to jobs and attending Skype interviews. I wasn't worried despite the COVID-19 situation. From experience, getting a job took months. But I had already checked my financial reserves. I was good for a few years, especially since my parents and wife were being very understanding about the entire situation.

All the while, I kept in contact with my ex-colleagues from that company, and their daily complaints about taking on my workload was like music to my ears. Hey, I no longer had to deal with that shit.

And then one evening, my ex-boss took me out to dinner and introduced to me the Director of an F&B company, the guy who would soon be my next boss. We talked about career goals and business plans over dinner and a cigarette. And next day, he messaged me to tell me to get up to speed on WordPress, while he got HR to prepare my application.

Shit, that had escalated quickly. But I liked the dude. And while my nice break was a lot shorter than I had originally envisioned, I was perfectly willing to work for him despite the fact that the office was at the other end of the island.


YouTube tutorials

I got to work, watching YouTube videos on how to code in WordPress, and one day before I was due to start work, I was already being drafted to attend meetings.

There was some consternation the next day with HR when I discovered that my probationary period would be six months. And that my job title was "Manager" of the newly-created InfoComm Department. I was slightly mollified at my generous pay package, which was far more than I'd ever been paid. But still... Manager? Christ!

The first two weeks were a bit of a struggle as we sussed out each other's working style. I found that my sometimes obsessive style of working meshed nicely with his propensity for hustling late into the night. Eventually, I ended up working from home again because the traveling was eating into the working time. I was tasked to bridge the company's e-store to its CRM (a success story in its own right), and by the third week, we deployed to Production.

Six months later...

My probationary period has officially ended. In the space of that half-year, I have deployed an ungodly number of features, met insane deadlines and in the process expanded the code base by roughly five times. The code base was a mess, but my boss didn't care as long as shit worked, and was delivered promptly.

It was hell at times, doing all that work all by my lonesome, but I'm happy. The fact that I have money and don't actually need the job, probably helps. And what I like about my current boss is, while the deadlines he throws at me are sometimes nuts, he has the sense to trust me to do my job and stay out of my way.

And just as importantly, nobody questions my worth to the company. Even in the short time that I've been there, my presence has most definitely been felt. If not in terms of my personality, definitely in terms of the work I've done.

Meeting targets.

More than once, I've been given the chance to show the company what I'm made of, and I like to think that on most occasions, barring a couple mishaps here and there, I've stepped up. There have been no major conflicts. Things could be better, but as I've recently experienced for myself, they could also be hell of a lot worse.

OK, I'm done!

I don't write all this with the intention of besmirching my ex-CTO's good name. Note that the name of neither CTO nor company was mentioned. Not once. Some developers don't have a problem openly trashing their former employers. Not my style. If I speak of any former employers, whether it be good or bad, they will always remain unnamed. That's just how it is.

Also, I have no personal interest in what befalls him or the company. This is merely an interesting story about yet another asshole boss in yet another short chapter of my career. Gotta admit, this lovely character gave me plenty of material. If you managed to learn something from this, great.

And this also marks another period in my life where I worked in three different companies in the space of one year. It's been nine years since the last time, and I'm getting too old for this shit. Still, I can take something positive from this. The fact that I could lose my job, and secure another one just like that - in the midst of a global pandemic, no less - tells me good things.

Talk about third time lucky!
T___T

Friday 25 June 2021

2020 - Three Jobs In a Year (Part 2/3)

As another couple weeks went by, my CTO became increasingly vocal about his dissatisfaction towards my performance. At times it almost felt like he was trying really hard to get a reaction out of me, other than a distant and dispassionate "OK", or "cool". This was deliberate - amid all the drama, I figured that one of us in the conversation needed to be the adult. The fact that I was the one who had to be the adult, was pretty disconcerting. Sure, I was older than him by ten years or so... but I wasn't the one in charge of the Tech Department.

For the record, I'm not holding myself entirely blameless. In many cases, my performance did fall short. But his reaction was to berate, express disappointment, and accuse. In short, not entirely productive. All it did was make me distance myself, because every time he sent me a message on Slack, it was mainly for one of these things. I grew to dread hearing the Slack notification message.

A habitual
finger-pointer.

One case in particular was for the user logout feature I had created in my second week on the job. It was working fine as it was, but he wanted to add another moving part to it. To be fair, it sounded like a good idea to me at the time, as well. However, it soon became apparent that by its very nature, the add-on cancelled out the first feature, causing the entire thing to be useless. When we had a conversation on this, he made it clear that he held me responsible for this, and remarked on the fact that very little of what I had implemented so far, was a hundred percent satisfactory. In retrospect, this was probably the point where the respect I had for him began to slowly bleed away. He was the one who had screwed this feature up by adding to it, but had shamelessly decided to blame me for a mistake I considered both of us equally responsible for.

A leader accepts his share of responsibility. This guy was no leader.

However, my disgust towards him did not truly solidify until one incident took place. You can read about it here - it's number five on the list. I'm a big boy and can handle jibes about the quality of my code. But he had called my professional integrity into question, on very little evidence and a lot of impulse. Such allegations should never be made lightly, especially in front of witnesses. (Another colleague was present at the time.) And when his allegations were proven wrong, he wasn't even man enough to offer an apology.

A conversation between developers

At this time, one of the developers left the company, citing a better offer from a new company. While he was around, I took everything he said with a pinch of salt, but once he had officially left, I called him up for some real talk.

Real talk.

True enough - my suspicions were confirmed. Now that he was officially out, he spoke a lot more candidly about my CTO. And it wasn't me simply being oversensitive. I was informed that my CTO was high-strung, anal-retentive and liked to blame people for things (I'm paraphrasing here). My ex-colleague had basically been biding his time and learning everything he could in preparation to leave one day, as part of his career plan.

However, my CTO was not without some redeeming qualities. During the pandemic, I was pretty stressed out over the fact that my wife was still in China, where it had all started. On her way back, she was stuck in Singapore's quarantine facilities and every day I was receiving the brunt of her frustration as cabin fever set in. Adding to that was my uncertainty as to how I could renew her Long-term Social Visit Pass, which was expiring that very same month. Pandemic restrictions were making it devilishly hard to make any appointments, or even contact the authorities. During a private talk where my CTO expressed concern at my declining performance and asked if I was encountering any personal problems, he proved surprisingly sympathetic towards what I was going through, and assured me that taking urgent leave to settle these issues would not be a problem.

I was grateful for the understanding, and still am. This doesn't change the fact that his behavior after that was really poor. But I don't want to paint a picture that says my CTO was a complete jackass. He wasn't. Human beings are complicated like that.

My probationary period gets extended

Three months were almost up. I was expecting either to be let go or have my probation extended when the CTO set up a meeting between him, HR and me. He informed me that I had not met his expectations, and my code wasn't what he expected from someone of my experience. I took the criticism with the same amount of grace I'd exhibited during all the other numerous times, but I was also brutally frank.

His criticism of my code was valid. I was unambiguous on that score. But I had noticed that his entire code base did not live up to his purported standards. There were obvious cut-and-paste errors, things that didn't make sense, and the code was nowhere as clean as he claimed he wanted it to be, with or without my input. Yet, the way he talked about my code, it was as though I came into his company and took a massive shit all over his beautiful, perfect code base. Yes, those were pretty much my exact words. Frustration might have caused me to get a little sarcastic there, but for the most part, I kept it professional. This actually seemed to put him on the back foot a bit, though it's hard to tell over a voice call.

HR said that it wasn't part of the company culture to simply fire people for not meeting expectations, and as such I would be given another chance. I was pretty amused by this (though I took pains to hide it). She made it sound like the company was doing me such a huge fucking favor. In retrospect, it might have been kinder to just put me out of my misery right then.

Extended by three months.

The end result was that probation would be extended by another three months, and I was expected to show marked improvement by then.

This was looking increasingly like the same situation back in 2011 - faced with a boss I had no hope in hell of pleasing and almost certain to be let go at the end of the extension. I almost certainly should have said "fuck it" and just given up, but that was the easy way out and my pride wouldn't allow me to throw in the towel just yet. My CTO had said that I could do better, and I really wanted to rise to that challenge.

Also, I was pretty tired of the job-hunting process.

The situation goes further south

I tried, I really did. I examined my own code, was more cautious about what I committed, double - triple - checked everything. Got more on the ball about reporting errors, providing possible solutions, and generally got less sloppy. And in the process, I discovered a few more disturbing things about the codebase (aside from the CTO's childish comments written here and there) in the form of missing validation, lack of basic security checks and sloppy unit tests. For all the big song and dance he kept making about clean, well-organized code, my CTO's code base was a spectacular mess.

At the back of my mind, I knew my time was pretty much up and started looking out for new opportunities anyway. All the while holding out hope that things would get better.

They didn't. If anything, they got worse. My CTO started expressing his dissatisfaction with me publicly during meetings in front of the team, and singling me out for admonishment. It was as though my lack of rising to the bait was bringing out the worst in him. What was more cause for concern, however, was that when we all got together in the office twice a week, he was nice and friendly. The put-downs, the criticisms, the berating, all came via online chat or video calls. Was he the kind of bitch that automatically self-censored when there was an actual possibility of getting his ass kicked for being an asshole? I was getting the distinct impression that my CTO was a Grade A pussy.

More vulgarities.

And then the UI guy (whom I got along with pretty well) reported even more vulgarities he had found in the code - and this time, they were embedded in the front-end. Again, the culprit was my CTO. I was dismayed, but no longer surprised. He'd thoroughly smashed all expectations I had regarding his emotional maturity at this point. Sure, this was in the Superadmin module where only Superadmins would ever see that code, but those Superadmins also happened to be our company's Sales & Marketing Department. He had already shown a lack of respect towards his own department's members, and now this had been extended to other colleagues in the same company. What was next - customers?

Whatever. I brought it to his attention and requested nicely that, from this point going forward, could we not have any more instances of this sort of thing in the code base? His reply was an "lol", but I most definitely was not amused.

However, he would soon discover that there was a limit to my patience.

One Friday, he called for an online meeting just after 6 PM. I'd gotten out of the office (where I was working that day) and was in the MRT. Over the Slack call, he heard the train announcement over the intercom and demanded to know why I was out of the office. At first, I couldn't believe he was actually asking this question, so I asked him to clarify.

He did.
"I said - why are you outside?"


Boy, this pissed me off. Did this clown actually expect us to be hanging about our workstations all fucking day on the off-chance that he might want to call for a meeting? A hint of a challenge crept into my voice as I replied.
"It's after hours. What's your question again?"


He might have detected the thinly-veiled hostility there. This was met with a second of stunned silence, both from him and my other colleague present in the call. But then he changed the subject, and I felt a momentary stab of triumph, petty though it was.

That's right, bitch. Back the fuck off.

A talk with my ex-boss

A week later, I had the occasion to have a chat with an ex-boss, and spent the evening bitching about the job. I griped about what a childish remarks my CTO had left in the code base, what a mess the code base was in and how I kept discovering elementary bugs in the system that did not seem to have been discovered in the past seven (yes, seven!) years, basic security and validation not taken care of, and so on. And somewhere near the end, my ex-boss made an astute observation.

"You can't work with them any more because you no longer respect them."


That hit home. Like a thunderbolt. I had, indeed, lost whatever respect I'd had for my CTO. Not just as a professional, but as a person. There was no coming back from that one. I needed to get out, pronto.

People who know me naturally also know that I'm not a big fan of rage-quitting in glorious dramatic fashion. No, this kind of thing has to be planned. Deliberate. Not with white-hot fury but with cold, calculated precision. To that end, I checked out my bank balance, intending to project just how much longer, financially, I needed to put up with my CTO's bullshit.

Holy shit. I'm rich.

The answer staggered me. I had never needed to take any of that shit. I had never even needed this job. Somewhere along the way, I'd amassed a small fortune without realizing it. But I've already told that story and, not being a big fan of repeating myself, I'll skip on ahead.

So here was my plan. I would see out my extended probation. If I didn't make it, problem solved. If I did, I was going to leave anyway. So I needed to start the job hunting and application process now. That stint with Red Airship was one of the things my search stirred up. Again, that story has already been told; moving on.

There's drama ahead, and this is a good stopping point. Stay tuned!

Next

How I got out, and landed my final job of 2020.

Tuesday 22 June 2021

2020 - Three Jobs In a Year (Part 1/3)

2020 was a roller-coaster ride for the entire world, for obvious reasons. COVID-19 made its toxic presence felt, and lives were merrily thrown into disarray. For me, professionally, there was an extra layer of chaos because it was during this year I went through an experience that I had hoped never to repeat from 2011 - going through three different employers in one year.

At the beginning of the year, I was a tech contractor from one of the world's largest tech firms, outsourced to a Government Statutory Board. My finances were healthy, I had learned plenty of new stuff, and once I learned to look past certain things, my colleagues were tolerable. Trouble was, I was bored out of my mind and it was beginning to show. I was goofing off at work, dozing off during meetings and basically not being altogether useful. It didn't help that the project I had been hired to work on was coming to an end, and all I had to look forward to, even if my contract was renewed for a third time, was another year of dreary maintenance work. There was very little in it for me to stay.

Running out of time.

To cut a long story short, I wanted out. It had been good while it lasted, but I really didn't need another year of this.

At that time, COVID-19 had just hit the sunny shores of Singapore and changing jobs was looking increasingly like a terrible idea. On the other hand, it was a now-or-never situation.

Preparing to Leave

Six months before my contract was due for renewal, preparations were well under way. I polished up my resume with all the value-adding stuff that had been accumulating the past few years. I sent forth my job applications like a commander releasing his battleships, and embarked on job interviews.

And that was how I ended up interviewing at the startup that was to be my next job. The interview went well enough, and at the end of it, I did the obligatory online assessment and went for a third round with the CTO, going through some tech scenario. The place was near home, and everything looked promising. If I landed the job, I would have to be comfortable with PHP Laravel. But to be honest, after all these years experimenting and actually working with so many different frameworks, they were all starting to look the same by now.

Life went on after the interview, and there were a few weeks left before the end of the contract with my employer. They offered me a contract renewal, but I needed time to think about it. That night, I got a call. It was from the HR of the startup that I had interviewed at. She was calling to offer me a contract. When she actually sent the PDF over, I didn't hesitate to sign it.

New horizons.

The money wasn't much better than what I was already making as a contractor, and I was fairly confident that had I accepted a contract renewal, I would have been making the same amount of money. But not everything in life is about the money. When you gotta move, you gotta move.

Leaving

The next day when I broke the news, my Manager's reaction was priceless. He said that according to the contract, I was supposed to give a month's notice before tendering my resignation. I pointed out that he was absolutely correct... but I wasn't tendering my resignation. I was merely declaring my intention to see out the remainder of my existing contract (all three weeks of it) and declining the offer of a renewal.

On a side note, this struck me as amusing because I've seen contractors being let go, and they always claim they weren't fired, but rather that their contract was not renewed, which is technically true. And now I was declaring the exact opposite - I wasn't tendering my resignation, just not renewing my contract.

The next few weeks went by fast. COVID-19 started making its presence felt in Southeast Asia, and very soon, we would all be asked to work from home. On the last day in the office, I wrote a short and sweet farewell email.

Dear all,

Goodbyes are awkward. Have some pastries instead.


Farewell food.

I left a bunch of curry puffs and fruit tarts on the common desk, went out for a smoke break, and when I returned to my desk, a good three-quarters of it was gone. I also took care to thank my contract agent for the years of managing my contract and negotiating pay raises on my behalf (side note, this guy is amazing and did better for me than I would ever have done myself) and at his request, even wrote a complimentary review which ended up on the company website.

Thoughts about the contract situation

If my company had renewed my contract much sooner, it's very likely I would have stayed for lack of other options. Unfortunately for them, they took their time about it. On its own, losing me is no big deal, but I wasn't the only one who declined a renewal. Including me, a full quarter of the team left; and the Manager of the our service account at the Government Statutory Board was put in the unpleasant position of simultaneously dealing with the fallout of a global pandemic, which meant that very few people were about to take the risk of leaving their current jobs for a contract position.

A long line for the job.

Perhaps they felt that as one of the largest tech firms worldwide, there would be no shortage of people willing to take up contract positions for them, and they could afford to take their time. Perhaps they felt that a firm in their position was, shall we say, leading the dance. But they failed to consider the fact that with the caliber of the people they hired for these positions, these people generally have options. And people who have options are generally not known to be content with lying back and just hoping for the best.

Take nothing for granted. Ever. This applies to both employers and employees.

The Next Job

The rest of my contract was served from home, and I began prepping for my next job by taking a crash course in Laravel. Gradually, I began feeling something that had been missing from my professional life for the last couple years - excitement. In the process of trying to pick up Laravel, I also learned VueJS. Some quick experimentation led to the code from The Easter VueJS Puzzle.

The first day at my new job was also the day that Singapore's Circuit-breaker began. It would be the first time I had ever joined a new company without meeting my colleagues. The only person I met was the CTO, who issued me a MacBook Pro and a list of software to install.

And thus began life at my new company. It was on.

Singapore's Circuit-breaker was very much in force in my first few months at work. People had to adjust to working remotely. That meant online meetings and collaboration through chat. It actually wasn't so bad because code and commits are tools developers use all the time. I had to get used to the other tools that the CTO introduced - bug-tracking suites, Kanban boards, API clients. We used Slack to communicate and share files.

My home workstation.

There was also this small matter of getting used to the MacBook Pro. I hadn't used a Mac since 2017. I did, however, get a sweet setup going at a standing desk in the living room.

The CTO also said that he would ease me in slowly with some small tasks first. I implemented a couple of new small features along with corresponding unit tests, a user logout feature and a dashboard that featured some Data Visualization (I was psyched to finally use D3 in an actual scenario). I was having a lot more fun in the first three weeks than I'd had in three years in the previous company.

Some early disturbing signs

However, all wasn't rosy as time went by. My CTO gave me the distinct impression that he was low on patience, had a short fuse, a bit of a control freak and was prone to finger-pointing - qualities that I don't consider admirable of any person in a position of authority. His criticisms of my code, however, were valid, and I took whatever lessons I could get from the code reviews. I was a big boy; I could handle bluntness and a lack of social graces. After all, nobody's perfect.


Still, while perusing the code base for a new feature I was to implement, I came across something I found deeply troubling. Above a block of code that had been commented out, there was a comment that had been left there a few months before I joined.

// Fucking idiot programming logic


Now, it would be hypocritical of me to get my knickers in a bunch over some profanities, considering I've been known to use them quite freely myself. What I objected to, was that it had been written in the code base. This was highly unprofessional, and I had a bad feeling that I knew who had put it there. Sure enough, after a bit of digging into the code repository, my worst fears were confirmed. My own CTO was the culprit.

Why was I disturbed over this? As mentioned, it wasn't so much the profanities. It was the fact that he had opted for such a juvenile way of expressing himself rather than confront this openly. A quick search found other sarcastic and vitriol-laden remarks in the commit comments directed at God-knows-who, ranging from a few months ago to years. Suddenly, my CTO wasn't looking like such a great guy after all. He certainly had long-running unresolved personal issues.

Willfully blind.

How did I handle this? I'm not proud of it, but I opted to ignore it for now. I was still under probation and didn't want to rock the boat. Perhaps he had simply been in a bad mood on those occasions. Perhaps it was work pressure. Maybe nobody told him he was handsome. At this point, I was just making excuses for bad behavior, and trying to rationalize it away.

Next

The next five months were excruciating. It's a long story, so make yourself comfortable.

Wednesday 16 June 2021

Five Unintentionally Funny Email Typos

Electronic communication is a huge boon, but sometimes due to fast fingers and faulty keys, the most hilarious typos can result and sometimes we click the SEND button too quickly.

Here are some of the most disastrous mistakes I've ever made in an email.

1. Bad signoff

This one was a good case study for using email signatures in order to avoid having to type the same thing over and over. Because mistakes can arise from repetitive action. In this case, I accidentally hit the "t" key instead of the "g".

Something silly.

Therefore, "kind regards" at the end of the email turned into "kind retards". Which is not only factually incorrect, but also politically incorrect.

2. In hindsight

You know how sometimes you want to send off a quick attachment through email but don't want to write a wall of text for what is otherwise a pretty self-explanatory thing? In those cases, you say "as attached" and send.

Butt seriously...

Well, there was this one time I did that, and soon after I heard giggling at the other end of the office. Apparently in my haste, I had added an extra "s" and it had become "ass attached".

3. ...out of nothing at all

If you didn't get the Air Supply reference in the title of this segment, no sweat - we're getting there.

What happened was, a user asked me to make some changes to a module, but due to the high usage in the afternoon, I felt it was safer to deploy to Production in the wee hours of the night. I tried to reply to the email to that effect; unfortunately, in a certain word, I accidentally typed "o" instead of "i".

Beary sexy.

So yeah, I basically sent a message to the effect of "I'll make love for you after midnight" when I actually meant "live". If I actually get slapped with a sexual harassment suit, this is gonna be my defense.

4. "o" dear!

Occasionally, certain keys get stuck. For one keyboard, it was the letter "o". Which, by itself, isn't such a disaster.

The missing 'o'.

However during some correspondence with a user, I requested a "running count" and as you can imagine, Murphy's Law ensured that I sent the text "running cunt" instead.

Ouch!

5. X-rated autocorrect

This one wasn't so much a typo as an autocorrect. While advising a colleague in email to use the Camel Case convention for the code base, the email client's autocorrect feature changed the word to "cameltoe".

Toe-tally.

Yes, that was a horrendous mistake. And I have no clue why the laptop did this. Honestly, "cameltoe" is not a word I use very often. In my defense. the laptop I was using at the time was actually company property, so the accrued vocabulary could have come from a previous user.

Terrible, terrible, typos

It's all fun and games until a finger slips and you send the email. Take a second or two to proofread - easier said than done when you're really busy, I know - and you may be thankful you did!

Kind retgards,
T___T

Friday 11 June 2021

Web Tutorial: The Navigational Menu

Drop-down navigation menus have been around for a very long time. They're a staple of website navigation, even in the age of smartphones. Back when I first started out in web development, I tended to think drop-down menus were accomplished using a mixture of HTML and JavaScript. The end result was that my menus were often computationally expensive and didn't work if JavaScript was turned off.

A couple years of experience later and much training on CSS later, I learned to create these menus using only HTML and CSS. It's pretty elementary; all that's really needed is a decent working knowledge of the "cascading" part of CSS. And maybe some understanding of the differences between inline and block elements.

Without further ado...

Here's some HTML. There are a few blocks of Lorem Ipsum text in the body, within the div styled using CSS class content.
<!DOCTYPE html>
<html>
    <head>
        <title>Navigational Bar Demo</title>
    </head>

    <style>

    </style>

    <body>
        <div class="content">
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras risus massa, aliquet non justo non, convallis tincidunt purus. Integer dolor purus, facilisis dapibus metus id, blandit dignissim lorem. Pellentesque ut lobortis nisi. Cras viverra nisi sed ligula vulputate varius. Vestibulum mi nisi, placerat sit amet mollis id, consectetur malesuada sem. Etiam vitae tellus in libero sodales convallis. Aliquam erat volutpat. Sed vel libero in orci pharetra cursus. Nulla sit amet congue lectus. Pellentesque suscipit turpis non urna accumsan pulvinar. Pellentesque luctus dui cursus lorem pharetra, a hendrerit massa congue. Donec lacinia iaculis enim in placerat. Sed dictum scelerisque massa ac sagittis. Pellentesque mattis mi non felis porta tempus. Vivamus nec ex semper, euismod ligula nec, mattis nibh. </p>

            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut consectetur erat orci, et elementum augue facilisis et. Nullam ligula lacus, dapibus vitae odio a, mollis tempus enim. Donec ut nunc tristique, semper massa vel, faucibus ipsum. Quisque est eros, varius sed placerat sollicitudin, eleifend in nunc. In auctor nisl sapien, sit amet tincidunt massa mollis sed. Suspendisse potenti. Duis egestas pellentesque velit id bibendum. Vestibulum varius bibendum felis ac fringilla. Donec justo mauris, posuere sit amet risus eu, cursus faucibus leo. Proin a ante sollicitudin, fermentum urna porttitor, ultrices neque.</p>

            <p>Cras massa massa, ultricies quis condimentum eu, accumsan ut est. Donec at maximus eros, vitae vulputate orci. Nam quis neque ac velit molestie volutpat id eu libero. In ullamcorper nisl eu arcu vestibulum, at venenatis libero fermentum. Proin ac sem pellentesque, vestibulum purus non, molestie turpis. In vel eleifend ipsum. In ligula dolor, sollicitudin eu bibendum et, varius a enim. Nulla tincidunt leo in ante semper laoreet. Sed lectus ex, rutrum sed consequat ut, molestie tempor elit. </p>

            <p>Pellentesque mauris ligula, suscipit malesuada risus at, posuere ultrices tellus. Nulla nec eros non ex ullamcorper tincidunt nec sed nulla. Fusce bibendum mi id dolor pretium, ac rhoncus magna viverra. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer lacus sapien, consequat ultricies consectetur ac, viverra a neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi aliquam eget tortor ut elementum. Maecenas commodo lorem mauris.</p>

            <p>Maecenas quis nunc id diam finibus ornare efficitur non orci. Quisque id ultricies risus. Morbi vitae elit pharetra, sollicitudin eros euismod, aliquam est. Ut sit amet libero tempor, auctor nulla vitae, pulvinar justo. Mauris ornare laoreet nisi, sit amet semper nibh accumsan sed. In id justo rhoncus, consectetur enim et, gravida purus. Sed vitae pellentesque urna. Pellentesque pretium, enim non scelerisque consequat, augue odio tempor felis, in laoreet leo massa vel diam. </p>
        </div>
    </body>
</html>


Take a look right now; this is your bare bones page without styling and navigation.


Now add a nav tag.
<body>
    <nav>
    </nav>

    
    <div class="content">


And let's do some styling. Let's do the body.
<style>
    body
    {
        font-size: 14px;
        font-family: arial;
        margin: 0px;
        padding: 0px;
    }

</style>


Next, we style content. It should have a margin from the top, to make way for the navigation bar.
<style>
    body
    {
        font-size: 14px;
        font-family: arial;
        margin: 0px;
        padding: 0px;
    }

    .content
    {
        padding: 1em;
        margin-top: 5em;
    }
</style>


And then we style the nav tag. Yep, this is totally HTML5. I am going to default to my go-to color; namely, shades of orange and yellow. This will be the background color. We set the  position property to absolute and the left and top properties so that the menu bar is affixed to the top of the page. width and height is defined such that the navigation bar will fill up a thin horizontal stripe.
body
{
    font-size: 14px;
    font-family: arial;
    margin: 0px;
    padding: 0px;
}

nav
{
    width: 100%;
    height: 45px;
    background-color: rgba(255, 150, 0, 1);
    padding: 0.5em;
    position: absolute;
    top: 0;
    left: 0;
}


.content
{
    padding: 1em;
    margin-top: 5em;
}


See what we did there? This is a good beginning.


The First Level

All right! Let's begin filling in the navigation bar with the first level. We will first use a ul tag to make an unordered list.
<nav>
    <ul>

    </ul>

</nav>


Then let's have a few li tags, or list items, in there.
<nav>
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>

    </ul>
</nav>


Each of these items will be clickable, so we use anchor tags in there.
<nav>
    <ul>
        <li><a href=""></a></li>
        <li><a href=""></a></li>
        <li><a href=""></a></li>
        <li><a href=""></a></li>
    </ul>
</nav>


And here's the text. For simplicity and obvious visibility, I will name them as such.
<nav>
    <ul>
        <li><a href="">Menu Level 1 item 1</a></li>
        <li><a href="">Menu Level 1 item 2</a></li>
        <li><a href="">Menu Level 1 item 3</a></li>
        <li><a href="">Menu Level 1 item 4</a></li>
    </ul>
</nav>


What you are seeing is the default look of unordered lists and list items. In order for them to behave like a menu bar, some styling is needed.


Firstly, we need to set each li tag in the nav element. The display property is set to inline-block, because we want this to behave like an inline element, yet we also want to set width and float properties. This is very important!
nav
{
    width: 100%;
    height: 45px;
    background-color: rgba(255, 150, 0, 1);
    padding: 0.5em;
    position: absolute;
    top: 0;
    left: 0;
}

nav ul li
{
    display: inline-block;
    width: 200px;
    float: left;
}


.content
{
    padding: 1em;
    margin-top: 5em;
}


Ah, now you can see it all lines up nicely!


Since we're at it, let's style the anchor tags here to be a bit more presentable. I've gone with white bold Verdana text, and set it not to display the underline, by giving the text-decoration property the value none.
nav ul li
{
    display: inline-block;
    width: 200px;
    float: left;
}

nav ul li a
{
    color: rgba(255, 255, 255, 1);
    font-weight: bold;
    font-family: verdana;
    text-decoration: none;        
}


nav ul li a:hover
{
    text-decoration: none;
}


.content
{
    padding: 1em;
    margin-top: 5em;
}


Looking good.


The Second Level

Now, what we want is for the second-level menu to appear when we mouse over the appropriate navigation bar item. No fancy animations, just the basics.

To have a second-level menu, we nest another unordered list and list items in any one (or two, in this case) of the main unordered list. For those items that have the second-level menu, I've added this ▼ to indicate such.
<ul>
    <li><a href="">Menu Level 1 item 1</a></li>
    <li>
        <a href="">Menu Level 1 item 2 &#9660;</a>
        <ul>
            <li><a href="">Menu Level 2 item 1</a></li>
            <li><a href="">Menu Level 2 item 2</a></li>
        </ul>

    </li>
    <li>
        <a href="">Menu Level 1 item 3 &#9660;</a>
        <ul>
            <li><a href="">Menu Level 2 item 1</a></li>
            <li><a href="">Menu Level 2 item 2</a></li>
        </ul>

    </li>
    <li><a href="">Menu Level 1 item 4</a></li>
</ul>


This is all you will see at this point. More styling is needed.


We first add this to ensure that all second-level menus are hidden.
nav ul li a:hover
{
    text-decoration: none;
}

nav ul li ul li
{
    display: none;
}


.content
{
    padding: 1em;
    margin-top: 5em;
}


Then we add some hover behavior to ensure that the second-level menu takes on these properties when its parent is moused over.
nav ul li ul li
{
    display: none;
}

nav ul li:hover ul
{
    width: 200px;
    float: left;
    margin-left: -3em;
    margin-top: 1.5em;
}


.content
{
    padding: 1em;
    margin-top: 5em;
}


More hover behavior on the parent, but this time it's the list item that is affected. At this point, the display property should now be inline-block. The padding and height is up to individual preference. float is set to left, which will ensure that the display is vertical because width is 100% of its parent, so each item will leave no space for the next item, thus forcing it to the next line. Background color has been set to orange as well, with a translucent white bottom border.
nav ul li:hover ul
{
    width: 200px;
    float: left;
    margin-left: -3em;
    margin-top: 1.5em;
}

nav ul li:hover ul li
{
    display: inline-block;
    padding: 1em 0.5em 0.5em 0.5em;
    width: 100%;
    height: 30px;
    float: left;
    background-color: rgba(255, 150, 0, 1);
    border-bottom: 1px solid rgba(255, 255, 255, 0.5);
}


.content
{
    padding: 1em;
    margin-top: 5em;
}


And now this is what happens when you mouse over! No need to set styling for the anchor tags unless you want a different look; they inherit their look from the parent.


Add this hover behavior to ensure that background color changes (I chose a nice yellow) when you mouse over the list item.
nav ul li:hover ul li
{
    display: inline-block;
    padding: 1em 0.5em 0.5em 0.5em;
    width: 100%;
    height: 30px;
    float: left;
    background-color: rgba(255, 150, 0, 1);
    border-bottom: 1px solid rgba(255, 255, 255, 0.5);
}

nav ul li ul li:hover
{
    background-color: rgba(255, 200, 0, 1);
}


.content
{
    padding: 1em;
    margin-top: 5em;
}


Yep! That's your second-level menu, right there.



The Third Level

Now I don't usually advocate for a third-level menu (much less a fourth) because it's a poor practice and should really be avoided. But what if you had to make one?

In those cases, more nesting would be needed. Let's use the third item of the main menu as an example. Nest another unordered list within second-level items 2 and 3, with more list items.
<nav>
    <ul>
        <li><a href="">Menu Level 1 item 1</a></li>
        <li>
            <a href="">Menu Level 1 item 2 &#9660;</a>
            <ul>
                <li><a href="">Menu Level 2 item 1</a></li>
                <li><a href="">Menu Level 2 item 2</a></li>
            </ul>
        </li>
        <li>
            <a href="">Menu Level 1 item 3 &#9660;</a>
            <ul>
                <li><a href="">Menu Level 2 item 1</a></li>
                <li>
                    <a href="">Menu Level 2 item 2 &#9654;</a>
                    <ul>
                        <li><a href="">Menu Level 3 item 1</a></li>
                        <li><a href="">Menu Level 3 item 2</a></li>
                    </ul>

                </li>
                <li>
                    <a href="">Menu Level 2 item 3 &#9654;</a>
                    <ul>
                        <li><a href="">Menu Level 3 item 1</a></li>
                        <li><a href="">Menu Level 3 item 2</a></li>
                    </ul>

                </li>
                <li><a href="">Menu Level 2 item 4</a></li>
            </ul>
        </li>
        <li><a href="">Menu Level 1 item 4</a></li>
    </ul>
</nav>


You see where this is going? Now I use the ▶ instead to show that this submenu item has more submenu items. But wait... the third-level items aren't supposed to appear yet. Let's fix this.


When a second-leven menu item is moused over, the overflow property of nested list items should be set to hidden.
nav ul li:hover ul li
{
    display: inline-block;
    padding: 1em 0.5em 0.5em 0.5em;
    width: 100%;
    height: 30px;
    float: left;
    background-color: rgba(255, 150, 0, 1);
    overflow: hidden;
    border-bottom: 1px solid rgba(255, 255, 255, 0.5);
}


Nice and neat!


Then we ensure the overflow property is set to visible when mousing over child list items.
nav ul li ul li:hover
{
    background-color: rgba(255, 200, 0, 1);
    overflow: visible;
}


And here we add this so that the ul tags under all these moused-over submenu items, have margin-top property set. This just aligns the element nicely; feel free to leave it out and see what happens.
nav ul li ul li:hover
{
    background-color: rgba(255, 200, 0, 1);
    overflow: visible;
}

nav ul li ul li:hover ul
{
    margin-top: -2.5em;
}


.content
{
    padding: 1em;
    margin-top: 5em;
}


Remember what we did for the second-level menu items? This is more of the same.
nav ul li ul li:hover ul
{
    margin-top: -2.5em;
}

nav ul li ul li ul li
{
    display: inline-block;
    padding: 0.5em;
    width: 100%;
    height: 30px;
    margin-left: 209px;
}


.content
{
    padding: 1em;
    margin-top: 5em;
}


There it is!


No more styling is needed. When you mouse over the third-level menu items, they will turn yellow, having inherited the properties of their parent.

Nav-er say nav-er!
T___T

Thursday 3 June 2021

Not a genius, but a grinder

It's no secret that I'm a fan of Liverpool Football Club. Their motto, "You'll Never Walk Alone", is literally tattooed on my skin. Yet, while it was the revelation of Michael Owen on the world stage during the 1998 World Cup that first drew my eye to LFC, it was another player who ensured that I continued to follow LFC long after Owen had left the club to play for Real Madrid.

Jamie Carragher
, retired as of 2017.

I own a few LFC football jerseys, and throughout the decades that followed, I've only ever had one name and number on the back - No. 23, CARRAGHER.

No. 23

Why Jamie Carragher? Well, we share certain traits. Like me, he wasn't the most technically skilled player in the team. He made blunders, some of them pretty costly. As far as I can recall, nobody was ever banging on our doors offering us big money for him. However, match after match, he went all in. He gave everything he had. Granted, sometimes it just wasn't enough. But his passion and pride was never called into question.

I consider myself less of a spectacularly talented Robbie Fowler, and more of a solid but unfashionable Jamie Carragher. While it was the likes of Fowler, Owen and Steven Gerrard with the silky skills and spectacular goals that I admired; it was the arguably less gifted but utterly committed Jamie Carragher that I related to the most.

"Touching fish"

Once, I asked my ex-boss a question. My current company's Director had hired me based on my ex-boss's recommendation. What had been the basis of that recommendation? His reply was almost Confucian in its inscrutability.

"Because you don't touch fish," he told me. This mystifying remark was put in context when he sent me a link to this article explaining how young workers in China get by on doing the bare minimum. (First "996", now this. These Chinese sure have a knack for popularizing work-related terminology, don't they?)

Now that's touching fish!

Though I'd like to point out that my aversion to "touching fish" isn't out of some misplaced sense of duty. End of the day, a job is still just a job. No, my motivations are definitely selfish in nature. (Selfish, geddit? Hur hur)

Go all in

In the tech industry, there are a lot of people smarter, younger and more knowledgeable than I am. My IQ is completely average; in school I was a B-student at best. In terms of sheer quality, I'm not in the top fifty percent of tech workers on this island; shit, I may not even qualify for the bottom twenty-five percent.

How have I coped with so much superior competition?

Simple - unbridled enthusiasm. Like my hero Carragher, I go all in. I've long accepted the fact that in order to compensate for my lack of actual talent, I have to hustle like a complete maniac. This lesson was learned fairly early on.

In school, I wasn't the smartest kid. The best scores I ever had were straight Bs across the board. Nobody ever suspected just how hard I had to slave for those Bs - for some reason, they actually thought I was just that talented.

Joke's on you, suckers. I don't have any talent. Not an ounce.

In the first semester of my first year in school, I made the mistake of thinking I was smart enough to coast with a minimum of actual work. My plummeting grades showed me the error of my ways pretty quickly. I came to the realization that I wasn't a smart kid - I was a hardworking kid and needed to play to my strengths. This took the form of doing my homework conscientiously, catching up on the required reading, obsessively coding and generally not having a life. From being a lousy student who got lousy grades, I became the kind of student people copied their homework from... all in the space of six months.

I kid you not. Straight Bs. My best results ever.

A slow, lumbering truck.

That pattern has repeated itself in my career. I'm not a racehorse, but a workhorse. Not a sleek, sexy race car but a lumbering diesel truck. Not a genius, but a grinder. Where people get by on their smarts, I rely on a certain amount of dedication to my craft. At work, I code. After work, I code. Once every couple years, I go back to school to learn more stuff while continuing to work.

Work-life balance is for bitches. Real men have work-and-more-work balance.

I'm kidding, of course. 996 isn't what I would recommend; chief reason being once this kind of thing becomes the default, people like myself become a lot more common and consequently a lot less valuable. The world is full of hardworking idiots; and only two things make me stand out.

One; not complaining about not getting my due. All I ever wanted from life was to code and be paid for it; and by that measure I've achieved everything I ever wanted. Get me fully engaged with the task at hand, and I'll put the average 996-er in the shade.

Two; acknowledging the fact that I'm a hardworking idiot. I constantly work on myself to be less of an idiot. Some of us have to come to terms with the fact that we're not as smart, as smooth, as talented as we would like to be. An overwhelming percentage of us are completely average compared to global standards. It's just that not everybody is willing to admit it, even to themselves.

I still fall short. A whole lot. But if and when that happens, it won't be due to lack of trying.

I'm also in a very secure financial place at this time of speaking, and losing my job is quite possibly the last thing I'm afraid of. Why do I still work so hard, then? Simply put, it's the only way I know how to work. That's a dangerous habit, and one I'm trying to break out of. You see, I'm 43. At some point, giving a hundred percent at work is not going to cut it anymore. As age catches up, my hundred percent could very well be a younger person's eighty.

One last caveat

A huge part of this blogpost has been about the value of hard work. Jamie Carragher showed me that a guy doesn't need a ridiculous amount of talent to get ahead, but he does need to demonstrate that he's all in.

Do not, however, make the mistake of thinking that hard work is enough. The value of hard work, by itself, is exactly zero. Hard work is a good start and compensates for a multitude of sins; but ultimately, we're judged by results.

Go all in, go the distance!
T___T