Couple days ago, I read something interesting from the internet about working culture in a Korean technology company (from a Korean expert as well #LOL). Well, for me to bring up this technology culture and organization will be a loooooong debate topic. As my simple understanding about technology, is the manifestation of us applying our intellect, which is the current course set by evolution.
It tried big and powerful, but failing that it is now trying ‘dynamic’; an ability to adapt to one’s surrounding much faster than gradual mutations ever could. Early years, when I got out of school, I remember being very wary of accidentally working for a software sweatshop provider. It was a frequent conversation between new grads. All sorts of industries have variations on this theme but in programming, sweatshops had already started to become significant hazards.
What we wanted to avoid in those days were jobs with crazy hours, hacking at mediocre code while under humiliating micromanagement. The sort of work that makes us wish we had pursued an alternate career. Maybe culinary #LOL, anyway herewith the story that I would like to share…
It’s not that I minded long hours when I was young, but given that I am essentially donating my personal time to an organization, in exchange for this I expected to work on meaty problems that would help my career. Most code is fairly routine, and with plenty of practice we can shut off our brain and just pound out stuff that kinda works. The jobs that I have loved over the years have been the ones where we went deeper than that. Where we didn’t just ‘barely’ get things working, rather we carefully crafted sophisticated solutions that solved real problems for people. Partially solving some aspect of a problem is easy, refining that to work flawlessly is exponentially harder, but it’s those deep solutions that people really need; that truly make their lives easier.
Of course, the type of code I wanted to write wasn’t just chucking some data onto the screen and then saving it a few minutes later. A sloppy GUI to support editing a crappy data model is just automating something already broken. Deep solutions require complex modelling so that they can add value on top of the basic data collection process. Really big, but low quality data isn’t going to be mined for any real insights, there is just too much noise embedded within it. Good user interfaces also require deep insights in order to properly structure the workflow. Littering the screen with tables, dropdowns and buttons is easy for the software engineers, but horrible for everyone else.
Besides the long hours and the weak solutions, sweatshops also tended towards hovering over their employees, while trying not to let them know much about the higher-up planning. My guess is that this is done for two reasons.
The first is to keep squeezing as much out of everyone as possible. That’s sort of an odd irony since programming is mostly intellectual work; the closer engineers get to burnout, the worse the quality of their efforts. But a really intense sweatshop doesn’t get this, so they think continually throwing the development into “crunch mode” will actually net them more results; they’ll somehow get a better return on their salaries.
Of course that directly leads to the second reason. The continual whipping to extract more from the coders will always result in a degenerating code base. If the initial version of the system wasn’t too bad, but the next version is expected to be a total bugfest, then it is a strong indication of a sweatshop. When ‘mediocre’ is the best possible outcome, that turns the morale of many of the engineers. My sense has been that in order to prevent the engineers from realizing this, we have to keep them super busy. If they’re just too tired to think at the end of the day, then they are less likely to reach the conclusion that their jobs suck. That they are just churning code.
Thus getting caught up in a sweatshop is a somewhat self-perpetuating cycle. They work we hard enough that we are too tired to escape, so we just hang in there on a day-to-day basis until way too much time has passed or we melt down. If we’re really screwed, we don’t even have any relevant market experience that would make you attractive to other employers. With no visible options, we’d have to take a serious risk in order to leave.
If we want a long career in building modern software, we quickly realized that we had to keep finding good positions that didn’t burn us out, but also didn’t lock us into some un-sellable skill.
Decades ago, there were lots of good development shops that were focused on building up reliable systems at a reasonable pace. That, of course, all changed with the dot com era. All of the sudden engineers became scarce, and programming shifted from deep intellectual construction to just an endless panic. Tech has always suffered from stupid fads, but suddenly the fads themselves became the bleeding edge, and the cost to play was that we had to work for a sweatshop.
Not surprisingly, the software being produced dropped heavily in quality. There are always counterexamples, but collectively the mentality shifted away from taking enough time to build something meaningful, to just getting anything out there and then trying to make it look pretty later so consumers don’t notice that it’s broken.
It certainly hasn’t helped that the methodologies drifted into being hyper-reactive towards the “stakeholders”. The idea being to cover one’s ass when building a mess by rigorously ensuring that the blame can be placed on the clients. If we did “exactly” and “only” what they wanted (even if they don’t understand the consequences) then how can that be wrong? To me that always seemed like a Doctor asking patients to self diagnose their own illness, so that they can’t be blamed later if it went wrong. The clients aren’t professional Software Developers, so why would they know how to build a working system in a reasonable time? They don’t even have a realistic sense of what ‘working’ and ‘reasonable’ mean. It’s a classic recipe for disaster.
Lately, I’ve been watching the job market (such as LinkedIn) again and I am saddened by the number of sweatshops out there. Even worse is that many of them actually brag about it in their job descriptions. Job ads that a few decades back would have resulted in 0 serious resumes, are suddenly extremely popular. Engineers seem attracted to these like moths to a bonfire. Companies are so over the top that they add perks like “frequently paying for dinner” as if they were actual benefits, but to me it seems to be enshrining a rather sick work/life balance. If their priorities are that skewed, the work is probably pretty shoddy as well. I love to work, but not enough that I don’t feel bad about missing out on the rest of what life can offer. In those extreme periods in the past where my years just disappeared in an instant, I’ve looked back with disappointment. Coding is fun, but so are a lot of other things… keep learning!
It seems like we’re in an epidemic of the sort of career destroying culture, for a new grad I was trying so hard to avoid. Programming shouldn’t be a continual high-stress hackfest. There are always times in any system’s life where it becomes difficult and stressful, but the measure of a good job is that those times are rare, not constant. If the development is thought through and the process is organized, than most days in programming are spent carefully working on building up reliable code. We need to spend time to make things of decent quality, they don’t just get created by accident. When the work is crazy, we might feel proud that we survived, but we can never really feel proud about creating that inevitable ball of duct tape and bandages. It is just ugly. Myself, I am driven to build things, software is just the medium I choose to work in. If I am going to spend a lot time building, then I need to be proud of my creations.
High-stress, of course, leads to rather poor thinking, and code is only ever as good as the thinking that went into it. Computers are “multipliers”, thus bad code realistically just makes the problems worse. You can hide that, but only for a while. So it’s been clear for a long time now that even if the code started out okay, throwing stressed out teams at extending it is detrimental in the long run. Setting up an environment that glorifies stressed out teams is unlikely to be sustainable (with a few notable exceptions). If we care about what we create, then we have to find an environment that does too.
In many ways it has been extremely frustrating to watch this continuing madness grow, even as we are becoming dangerously reliant on software. It’s like watching a car crash in slow motion. The pools of good jobs are gradually drying up, getting replaced by sweatshops. Each year more people proclaim crazier and crazier approaches to building software that pivot on exploiting some obviously bad shortcut or a hopelessly redundant time wastage. Eventually enough people catch on that the latest fad isn’t helping, but by then something even worse has come along to replace it. We’re so trapped in bad approaches right now, so deeply, that many newbies think they are actually the core of our profession.
The truth is that at some point, with enough variation, we start to realize that most of the industry’s persistent problems are self-inflicted. And by the time we finally get to this realization, we’re heavily wishing that we had pursued an alternate career… how about culinary (again)!
Life is a journey and it’s about growing and changing and coming to terms with who and what we are and loving who and what we are.