Featured

Not effective way to build a product

There are many ways to go about building and shipping a product. Countless product companies have shown how to be successful.

This article is not about that.

I am here to talk about a specific non-effective way to build a product I encountered firsthand and don’t think is right. This way is something I have seen variants of during my brief career as a software engineer. Due to the culture here, I feel pretty confident to generalize to the whole of the tech industry in Singapore. But I will not generalize it to else where in the world because I have not experience them firsthand. It just won’t be right.

Background

You are a company with multi-hundred millions in profit every year, and there are thousands of employees scattered across various business units within the company. These employees are required most of the time to take on multiple projects, applying their specific skills in those projects. As a company, you have been around for nearly half a century, have worked on countless projects, and successfully delivered them. Your core business is about delivering solutions on-demand.

Recently, a new project was awarded to you and you like to make the end solution a product as part of the company’s new direction to build products. The project was also sub-contracted out to another company from overseas to do the other part that you have zero experience in and is also more cost-effective.

What did you do?

You “parachuted” in someone who wasn’t included in the original tender process to lead the project. This person has no idea what just happened, no background, nothing. Shortly after, you got a new employee who only has prior experience in developing web-based products and working experience in data science. This new employee is responsible for everything backend.

Over the couple months, the project team was tasked with design of the application, with incomplete information, incomplete user requirement, and called upon to start writing codes because the project only has a six month before delivery.

Three months since the project started, you got a couple of new hires to fulfill the headcount that you submitted as part of the project tender. The new hires were “orbital dropped” in to think of, design, and implement functions that the users will want in addition to the pre-existing ones defined in the specification, which are scoped way out of the capability of the team, half of whom has zero experience in the specific technology stack.

You also expect the team to build the application (both backend and frontend) such that it is highly modular for “anytime” enhancements and capable of supporting future requirement of supporting mobile platforms. Full delivery is also expected within six month.

At the same time, you expect the barebone team to also deliver proper documentations in accordance to CMMI. These documentations will be subjected to audits in six months time, same time as the project delivery.

Lastly, you also told the team that the project is on very tight budget and can’t afford any delays.

What you didn’t do?

There isn’t even one full-time product designer taking care of the whole user experience because the project funds didn’t cater for that.

In addition, there is no product manager and instead you have a project manager who has zero experience in building a product and successfully deliver that.

Existing solutions from other projects that are very similar to the one the team is building weren’t shared and everything has to be rebuilt from scratch.

Design wasn’t done for even the individual components, with zero standards to follow when it comes to building the various software layers. Everyone is given free rein. The project isn’t following agile development and isn’t design-driven,

No additional backend developers were added due to budgetary constraint.

Information isn’t flowing freely due to compartmentalization or simply lacking because you didn’t get someone experienced enough to ask the right questions.

What is the end result?

Without a proper designer, the application is basically a bunch of duct-taped solutions with ugly icons and images without detailed care of how user will interact with it.

The application as it stands now also has poorly named classes, poorly defined functions, with zero standards on the APIs. Proper use of design patterns were non-existent.

Documentations are all still in rough drafts, with each person covering their respective portion, and not even complete despite audit is in few days time.

The team member who has to deal with the backend is so swarmed with work and has to stay back late for the last few months until it affected the husband-wife relationship and parent-child relationship. That team member did raised the request for additional manpower but kept getting rejected and was told by management to work even harder.

Of the new hires, one has zero interest in product development or thinking like a product developer, will only do as told, leave work on time, and has no further desire to climb the ladder. The code written was functional and in accordance to specification but lack any proper design, lack care for usability and performance. This new hire is focus only on frontend development and has minimal backend experience. The other became a full-stack developer, has product development root, has desire to grow as a product developer and designer but didn’t get any mentors because the focus was project delivery. This person has no issue with delivering but felt thoroughly dissatisfied with the job. This person also already has his other foot out the door, looking at a career change and is just looking for a reason to quit product and software development for good.

As it got closer to delivery date, the team is hit with new information about the customer’s environment that possibly wasn’t thought of early during the requirement gathering stage. Now the team isn’t even sure if it’s possible to replicate customer’s environment fully to test out any solutions.

Conclusion

With a dysfunctional team, dysfunctional management, poor information dissemination, the need to reinvent the wheel so often, product development just simply cannot take place no matter how much you wish for it.

The culture of the company, and the project-oriented mindset of the higher management and people on the ground is just very inconducive to product development and innovation. So that is another nail to the coffin for product development.

So if you are a big company and really want to build a product, please don’t do it this way.

Advertisements

Journal #253 – Documenting my Monday

After spending the last half an hour struggling to narrow down a decent thought to start writing from, I decided to give up. Documenting my day shall be the default mode rather than wasting any more time trying to find a perfect topic to talk about. And part of my decision process included me writing something on Facebook that got me settled down.

So what’s my day like?

I went to work slightly earlier today because there is a company-hosted dialogue session for new employees. The best part of my morning was I was melting as I made my way to office from the MRT station. In other words, I was basically sweating non-stop until my shirts (I wear two layers, one to absorb sweat) got soaked through. My body for some reason felt exceeding warm and just keep sweating. Yesterday was fine actually. The worse was when I was getting my daily Starbucks and I was just standing there waiting for the barista to make my coffee.

At the dialogue session, the person conducting was one of the department manager introduced himself and got us to introduce ourselves. Then he talked about how the company is transiting to building products instead of just providing services and doing projects.

After the whole talk, I am not even convinced because I have been lied to so many times by company management about building products and Singaporeans in general always think in terms of project. It’s almost like they are incapable of thinking in terms of product development. That’s just my conclusion from what I have seen. I want that conclusion to change and in order for that to change, I need to see actual Singaporeans doing product development.

I would like someone with way more experience in product development to share what are some of the most common approaches to product development in a company. Whatever I know right now is theoretical (I think closer to be naive) and I have never got the chance to experience it. And by theoretical I mean some of it is based off this article by ThoughtWorks. I also have an idealistic view of how products should be built.

One aspect of product development, which I think is important, is the process has to be design-driven. To me, without being design-driven, it will be very hard to lay down the foundations for future growth because you don’t get the chance to ask the right questions.

The other is having a team of product developers, not just developers who think short term and simply want to get the project done and over with.

One last very important thing is funding. I believe that you need to have a delicate set of funds to support the process of product development. You can think of it as an upfront investment. I don’t know how correct I am on this part but I have experienced enough where the company simply don’t have the money to support product development because the money comes from existing projects. All the research and development, trial and error, etc. simply couldn’t be done properly. All that tend to make me doubt the company about its ability to build and sell products. Again, I could be wrong. Someone please correct me on this.

After that, I went back to my desk and continued to implement whatever features I need to do and fix any bugs found. Tomorrow is when we will be deploying a proper set of applications for the actual use by the customer over the holiday week. So we will be testing it heavily over the next few days to identify any further issues and fix them fast.

Thus far, I hadn’t been enjoying the process of working on this project. The biggest gripe that I have is with the project approach the company is taking despite their claim of wanting it to be a product. But it’s not up to me at this moment because I’m not in that position. And I have no intention of being in that position because I never want to manage people. I just want to focus on doing what I am doing to the best of my ability.

The other gripe I have is with the design side of things. Design just wasn’t done properly and every developer is just implementing stuff their way just to meet the basic use cases. Our team lead did try to ensure whatever we implemented is useable and perform well but that’s about it. It’s not his fault really because his plate is pretty much full too. At my company, one person will be responsible for more and more projects over the years. So with that kind of multitasking, I don’t think it will be possible for that one person to think of the future of a so-called product.

For me, I did try my best to think of the future—think about how the user will want to use the application and what will happen if I don’t do certain things. Within the short time frame, I did whatever I could to add certain kind of controls, ensure certain kind of interaction the user can have with the application. But I also know that I could be completely wrong with what I implemented and will need to change later. I have also tried to ensure code reusability by introducing more layering.

By around 5.45pm, I was done gathering the latest client code from source control and compiling the codes into a deployable application for tomorrow. I put the compiled files into a folder on the share folder where my other colleague was preparing the server stuff. I waited for my colleague to finish putting everything onto a thumbdrive before leaving.

So tomorrow, I will go to the customer office to do the deployment and testing the applications. I do hope it goes smoothly.

I went home to rain and then join my mom for dinner at the Legendary Hong Kong restaurant. I ordered Seafood fried rice with XO sauce, pineapple drink (basically canned pineapple with syrup), and steamed shrimp dumplings.

Nothing too fancy but then the price tag is just not worth it. The food is just too average and I could get them cheaper from elsewhere. I think I will avoid going to this restaurant in the future.

Journal #244 – Maybe mundane work but it starts from one

At first, I found myself procrastinating about writing this journal because I wasn’t sure what I want to talk about. There are a few things in mind causing me to doubt if I am able to squeeze them in and give a relevant title. Then as I wrote the subsequent paragraphs, it became obvious that I should cover different aspects of my day in separate journals. So after some editing and sorting, this journal is about work and how “one” is an important number.

I will just say that work was pretty mundane. It’s all about going through the drudgery, fixing bugs, testing the fixes, implementing new functionality to improve usability and tweaking certain areas of the application.

The latest update I got from my team leader was the customer wanted at least a few instance of the application running on their workstations before Christmas so that they can test it out over the last week until New Year. That means we don’t really have that much time to implement any brand new features.

So with the time we got now, our priority is getting the pagination capabilities working. Thus far, our application hasn’t been doing any pagination, server-side sorting and searching. That happened because we were so focus on delivering function that we didn’t put performance first. In hindsight, it’s probably because the application is a thick client and the workstations can do the heavy lifting. At least that’s what one of my colleague seems to lean towards.

As of mid last week, we were actually loading thousands of records over the network into local memory. An utter embarrassment. Right now, I feel disgusted with our current codebase. Yes, the code works and there are design patterns being applied. However, the way the patterns are applied look like they are hybrids. Even my own codes are ugly.

Bug fixes and User Interface tweaks were done in the morning. After lunch, I spent my afternoon doing that pagination stuff, at least getting the basic function right and removing the unnecessary multi-threaded operations. Honestly, it didn’t take me longer than an hour to get the basics working and tested, only to find that there were some performance issues. Tomorrow I will go and test more after my colleague tried to optimize the backend codes and have already deployed it into the development server.

I also had a discussion with my team leader on what I will do next to improve usability because I had some ideas. After explaining, my team lead asked, “Do we even need to implement that feature so well? We are not Apple. We are Android.”

It’s a known fact that I am a fan of Apple because of their well-built products which made my life convenient. Their products are very usable and intuitive. There’s quality everywhere, which is inline with what I am looking for. And I’m willing to pay for that.

With that comment, I went on to justify that if we don’t do what I suggested, then user will find themselves drowning in pop-up boxes and alerts, which are all distractions, pulling them away from what they want to achieve. It slows down their workflow.

From management perspective, it’s probably overkill for that given module that I’m working on. It’s only used by system administrators, which aren’t many. Therefore, it’s easy to see it is not cost effective to do that part so well.

But I don’t subscribe to that school of thought. I believe in committing to quality for one person, one software module, or one software function at a time to achieve extraordinary things.

It’s like my journals. I’m a nobody and I’m writing this journal for me because I want to document my own journey in life. I want to see how far I have come. But if I can’t even deploy that discipline, patience and desire for quality, I won’t even read my own journals, much less improve.

There is no doubt I will fumble and some of my journals are too boring but at the end of it, I will still feel proud of my own work because I tried to do it for one person, which is me. And if along the way, these journals even helps one person in any form or shape, it is the best thing in the world.

Don’t just take my word for it. Practice focusing on and committing to one thing at a time, deploy the patience and discipline and giving all your best. Gary Vaynerchuk also advised in his blog post about WHY 1 VIEW CAN CHANGE EVERYTHING. Or Yann Girard on The only way to succeed at anything

So work maybe mundane but if you can’t even do one mundane work with quality, you can forget about doing it for everything else.

Remember, everything starts from 1…

Journal #184 – Onwards! Marching Towards My End Goal

When I started writing this, I wasn’t sure what title I will be giving and I will be lying if I say I knew what I want to write about upon staring at this blank canvas. So what I will do is just write and let the process take over.

First, I will say my progress at work has been decent. I’m quite happy that my codes have not yet hit any major bugs during the integration process.

However, one of my colleagues has definitely commented a lot about my approaches to API design and implementation. She dislike that I’m returning a list of entities instead of a list of IDs of those entities from my application services. It meant that she had to post-process the results and extract the data she needs. She also commented on the naming of the functions as they were not the typical function that begin with words Get or Set or Update or Save. I named my functions in accordance to Tell, Don’t Ask principle with the exact purpose of the function stated clearly as part of the function name. Yes, some function names are verbose but if you read it carefully, there is no confusion. She also don’t like the fact that I use String as parameters for querying instead of integers.

All these comments definitely have in some way upset me because in a way, my reality and world view were being destroyed by someone else. But I let it go as there is no need to hold on to the negative emotions. I standby my approach and what I have done but to make her life easier during integration, I added additional functions that accept the parameters that she wants to supply. Depending on the situation, I do a double-dispatch or simply repeat myself. Yes, I do know the latter approach is completely wrong. One should never violate DRY principle.

Other than that, I focus on developing the WPF side of things for the identity and access module. I still see myself as relatively new to WPF and so I spent a lot of time fumbling around before I achieve what I want. There are of course lots of things I still don’t comprehend fully. As there is a super tight schedule, I had to focus on achieving some kind of useful output with whatever knowledge that I do have and could gain. And I dare say so far so good. The user interface is coming along nicely.

After work, I reminded myself again that I don’t want to do programming anymore…definitely not on a full-time basis. Part of it was because I never like being squeezed by tight deadlines. I also never quite enjoy working with other people. All of these always raise my blood pressure, give me some sort of anxiety or panic attack. And if I’m not careful, my health, both mental and physical, will suffer. What is keeping me going for now is the money. And I got to repeat it again: Not at the expense of my health. I am still trying to reach my end goal of having enough to do a mini-retirement by 32 years old and then switch over to do something that I truly enjoy, which is writing in general. 32 years old isn’t exactly very far away for me. It’s in two years time and I just turned 30 recently.

At home, I spent my free time watching Van Helsing Season 2 and Ghost Wars, having dinner, and just simply chilling.

Here I conclude my journal for today.

Journal #169 – End of Third Week at Work

Today marks the end of the workweek at my new job. I have mostly eased myself into the job, focusing on doing what is required, ignoring the other noises.

In terms of adapting, I like to think that I have done that. I am comfortable in my role now. I am comfortable with my colleagues. And I am comfortable in my current environment.

As for familiarizing myself with the project, it’s still a work in progress but I doubt I will need to know the full picture or interact with the vendors and customer. I don’t want to. Why? It’s to reduce my mental load and so that I can focus on what’s truly important— coding.

During these three weeks, I have also mostly picked up on the basic aspect of using .NET and C# in general and was able to complete the implementation of various small use cases on the frontend. I also start to appreciate the beauty of C# though I still don’t quite enjoy using it as much as Java. But since I am a writer first, programmer second, I just saw it as Java is my mother tongue and C# is my second language. At the end of the day, they are like English and Mandarin, and are really just tools for me to put out my solution or idea.

My next task for work is to develop the identity access component and that means I have moved to backend development. I foresee I will probably spend the next two weeks on this. As part of the development, I spent quite a fair amount of time first to understand the business requirements through discussion and extracting out the use cases. Of course, my approach is to code while extracting out the use case. This is my way of setting in stone my idea, so to speak. It helps me to identify flaws in my design that were initially in my head.

For my freelance work, I also uploaded a compiled jar to the client’s FTP server. I also managed to finish implementing a new function.

So in a way, it’s a rather productive week.

Before I forget, my application for deferment of the military in-camp training was successful (not particularly happy about it). I also received a call-up for another make-up training set on the first two weeks of January 2018 on the same day via SMS. Well, I wanted to go back for the make-up as soon as possible, made it known to my unit, and was informed January was the earliest possible. Not ideal but better than nothing. So in a way, the year 2018 will see me going back to in-camp training twice. It’s fine though.

Here I conclude my journal for today.

Daily Journal – Aug 11, 2017

This is my 127th journal.

Despite me sleeping at around 0200hrs, I set the alarm clock to wake me up at 0730 hrs this morning. I intended to go to my client’s office to do some more work.

I spent one quarter of my time in the client’s office doing research into domain-driven design and the rest doing code refactoring and implementation.

My activity for today aside, I noticed that I no longer have the desire to spent the next few years of my life doing software development. I don’t even feel like doing any software work now except for the sake of money. Concurrently, I’m putting my plans into action and moving myself into the creative line of work.

Anyway, I left the client’s office at around 1710hrs and went to Uniqlo @ Jurong Point. Decided to get two plain-colored T-shirts and a black sweat pants.

These are part of my minimalistic lifestyle and serve as my uniform.

I got home at around 1830hrs, showered, and waited for dinner. In the meantime, I was looking for courses on Creative Writing, and career opportunities that are not related to software development. Yes, I want to try something else now and seeing it as a career change.

After dinner, I watched season 3, episode 7 of Zoo (TV Series).

I will probably go to bed early today as I need to wake up early tomorrow for a drone piloting course that starts at 9am sharp and ends at 6pm. I will do my best to prepare the journal for tomorrow with photos and videos.

That’s all for now.

Here I conclude my journal for today.