Anti-patterns and Malpractices in Modern Software Development (2015)
medium.com
medium.com
The only issue is that I still get blamed. I don't know how many times I've repeated this scenario:
1. I highlight gap / issue in code.
2. Team says, "Need to ship; we'll accept the risk"
3. During go-live, fecal matter hits fan because of aforementioned gap in code.
4. Everyone acts surprised.
5. I point out that I mentioned it 2 months ago.
6. Everyone makes excuses / claims they don't remember it that way / moves on to burn down another project.
7. I'm left to clean up a mess / have taken a hit to my reputation.
Not sure what I'm doing wrong...
If the Business Unit, for whom the software is being written, has a representative on your team, then make sure you explain the risk in purely business terms, not technical ones. A BU rep's ears are going to perk up with statements like "invalid posts may get written to the general ledger" or "1 in every 20 orders may get dropped" rather than "universally scoped variables are being overwritten by invalid data in some cases" or "uncommitted nested transactions may cause a core dump."
If your team doesn't include a BU rep, then you could always get friendly with one and explain the potential risks over coffee or lunch. Perhaps even suggest some questions the rep should ask the team before the mod goes live.
In my situation, a BU rep is always part of the team and I rarely have other developers on the team. The reps and I have lunch together regularly anyway, so they get my opinions and recommendations that way.
FWIW, 2 things mitigate this. First, some companies do actually remember people who fix things and get things done, so that's on your side. The other is that it's not likely you'll be there long-term anyhow. Companies that do this also generally fail in other departments, like paying you what you're worth as your worth increases. So you'll probably look for a new job eventually anyhow.
I know it's hard to see from where you're standing, but I wouldn't fret about it. Just keep doing your job the best you can and warning them, and let the chips fall where they may.
Then, after people have a visceral positive feeling about you, make some tiny suggestion for improvement. Make the improvement, and whoever approved it, do something to make sure they associate your suggestion with a positive experience.
Slowly repeat. It is a slight selling of your soul. It is effective.
In the country of the blind, the one eyed man gets locked up in a lunatic asylum.
>Not sure what I'm doing wrong...
probably you're doing it too serious and taking it too personal. After 20+ years in the industry, I got desensitiveized enough to bother that much about small things, and when i point to the issue i usually do it in the "constructive" "spirit-sharing" and "team-building" way - "Ha! Just imagine how those suckers - customers or downstream devs - would be hitting that bug, completely lost at what to do, they would have no chances to make it work so we should give out a Grand Prize to the unlikely one who would make it through... " I noticed that various leaders/management/etc. have hard time to full-heartedly subscribe to that vision of future. Not that that gets the thing fixed or anything like this, mind you. Yet it helps with the blame part if/when it still comes my way - "Wow! when _we_ (me and you, the manager/etc.) were laughing at it _we_ did look into the crystal ball! _We_ are that smart!" The management somehow don't enjoy sharing in on that smartness :)
Perhaps you failed to build a paper trail (i.e. an email trail) to document the fact that you predicted the disaster, and who it was that decided to ignore your warnings. If you do that, when the fingers start pointing in your direction, you can send everyone copies of the emails that prove who is responsible for the mess.
At some point (agile?) we explicitly gave up all moral responsibility for our creations, to people with money.
In that case, the mechanical engineer would certainly acquiesce, just like most of us do when management prefers speed/cost to scalability.
Not any more.
But in the 19th century bridge failure was quite frequent, until things like the Tay Bridge Disaster happened, and then some standards were imposed, and engineers and others were empowered to enforce high standards.
In any field you can have fast development, or you can have safe development, but you really can´t have both. It remains to be seen quite what level of software disaster it will take to bring this lesson home in our industry.
- 508 / ADA compliance
- HIPAA
- AICC / SCORM / cmi5
- PCI / DSS
Things like code quality and inner loop optimization are largely irrelevant for the people who are using the software.
Our industry loves to write CYA statements about the product not being intended to be used in critical situations and bury it in the fineprint of licenses we know customers do not ready anyways. Then, we act surprised when the same customers go and use the product in life or death situatioins.
This is not theoretical, just to highlight the most well known example: Our current generation of social media was created for the purpose of allowing college aged people in first world nations to share trivial details about their personal lives with friends and aquaintances. But now we see activists using the same media to organize civil resistance against governments; specially governments with huge stains in their human rights record.
You hit the nail on the head. It happened when we stopped financing our own work.
Maybe they should. There's a reason agile won; it was and remains more efficient than the alternatives.
Better from the market's POV != better for the people who use it.
We would have dramatically less surveillance programs, automated enforcement and bombs if there wasn't as many people ready to blindly write the software for them.
We should be thinking hard about what we are building and how it will be [ab]used, especially in government.
"I try to stay much less emotionally attached to the end-result".
This is the mindset that drives most of military, police and totalitarian policy. You don't drop a bomb or violate the constitution without a bit of emotional divestment.
I don't know about you, but if I'm not given what I need to do something, there is no way in hell I'm going to take responsibility for it.
EDIT: Not to mention that, if I do hold my ground and refuse to do something until I have what I need, the company is going to fire me and find someone who doesn't give a shit. And quite frankly, I like being able to buy food.
It seems like there is a class division now, even at startups where the devs are on the frontlines and all actual decisions are kicked up a hierarchy.
If there's a quality issue, the frontline devs should be able to blow the whistle and get the problems resolved because we have the technical knowledge to identify the problem and to fix it.
CYA, Cover Your Ass, is a good call though since the tech companies aim to keep developers down.
Developers need an appropriate level of authority.
Building something safety-critical? Every dev needs to be able to "pull the rope and stop the train" if something isn't right.
Building a toy? Kick the "this is fragile, should we do it?" questions up to the PM.
I don't want my devs deciding to arbitrarily gold-plate every trivial feature, but at the same time, if there's a latent quality problem, I need to know about it.
Blaming an engineer for supposedly poor engineering is a lot more politically viable than blaming management for poor management -- because they're higher on the chain of command than you are.
It can also work to just take a little longer on a feature and do some cleanup/fixing without getting permission. If anyone bothers you about it, just say "I noticed this issue and wanted to avoid running into problem xyz again since it took us offline last week." Again, most of this boils down to tact. Project managers don't like looking bad to upper management. Usually you just have to point out (tactfully!) how dumb they will look if something crashes in prod on a weekend.
That's insulting for the cows !
Do you get that?
Things shouldn't be this way, that's the whole point of the article.
I apologize.
I'm frustrated at work, I don't understand why all these intelligent, capable people wind up building such a haphazard, nearly spastic organization.
I should not fault you for coping, even thriving, in a world not of your own making.
1. His first two points, stripped of the irrelevant polemic, are the complaint that software is meant to help the business meet its goals. Well, obviously it is. Very few people are paid to build software as artistic expression; that's for personal projects. Software that doesn't meet a business goal is bad software, no matter how elegantly designed.
2. His third point is that when you're in an organization staffed by people with their own personalities and goals, you need to be able to communicate and negotiate and engage in all kinds of human interactions. People who call this "politics" dismissively, as the author does, and think that it is intrinsically bad should never have a job where they have to interact with people; stay a low-level code-wrangler.
3. His fourth point is... well, honestly, it's that he hates his job. Sorry. Most people don't, though. If I were him, I'd look for a different role.
4. His fifth and sixth points are that if you work on a team, you also have to work with teammates, who will have their own personalities and goals and interests, and you'll need to be able to communicate and negotiate and engage with them. Um, yeah. If you aren't willing to do this, you're going to be a terrible teammate, and this guy sounds like he would be one, with all the griping he does about the coworkers he hates.
5. His seventh point is about collective code ownership, which is about treating developers as collaborating equals rather than letting one person on a power trip control everything. This upsets him, because he's the guy on a power trip and he wants to control everything.
6. His eighth point is that management methodologies exist. He seems to think this is self-evidently terrible, rather than considering that changing management methodologies can make a huge difference to the success and happiness of a team, and that agile methodologies are much better than old-school command-and-control waterfall stuff in a ton of ways.
7. His ninth point is that you're not cynical enough, because you don't hate everything already, and he does, and that makes him a better person, and you should also join him in hating everything and everyone.
This is literally toxic advice. Do not take it, and if it sounds reasonable to you, it's time for some soul-searching.
Even if it truly weren't economical to build quality software and to use real engineering to reduce risks toward achieving that goal (realistic deadlines based on past estimation error, known unknowns in planning, evaluating and training people, scheduling refactors, avoiding defects in the planning stage, planning for the duration of components' lifetimes so you can build things and eventually replace them instead of constant myopic re-architecture) -- which I highly doubt -- who's to say we have to be motivated solely by self-interested short-term economics? If the costs are externalized, of course it's more economical to do everything as shitty as everyone can get away with. What kind of Objectivist nonsense is it to say that that's the same as correct?!
For some of us, money isn't motivating, the collective consensus isn't compelling, it's not possible to be simultaneously disengaged and productive, we find investing so much of our conscious time and effort toward something we don't value existentially frustrating and simply want our investment of time and effort to result in software of quality, as simple as trying to maximize for durable utility -- as much as possible, leaving the lives of its users better off for using it, and existing and paying that dividend for as long as possible -- (true economic value) and we find we're not allowed as the majority of managers and team mates have bought into the modern kind of myopic and psychopathic faux economics of me and now. Do you really propose that we are the ones who are wrong? If we are, what's to be done -- do we accept we aren't cut out for the rat race and go live in a van?
Doing stuff to serve business needs is not intrinsically bad, or opposed to craftsmanship. The whole idea of craftwork is that it serves a purpose, right? It must have an actual function, and the goal is to build a thing that serves that function well. So yes, you should absolutely build software that fulfills its purpose well. Just remember that the business is the purpose, not the software in itself.
This isn't just about economics, it's about a larger perspective. Think about the people who use your software, and every time you're thinking about what you're doing, think about how it will impact those users. Will it make their experience better, or will it just make your experience better? (If the latter, don't do it.) Will it make their experience better, but there are other things that they'd really rather have. (Ensure that you're working on the right priorities.)
A lot of the things you list as "real engineering" -- realistic deadlines, risk management -- are things that absolutely do help the users: They want to know realistically when they can expect functionality to be there so they can plan for it; they want to know what things might throw that schedule off and be kept up to date on whether they're happening. So a good workplace will use those things.
(I'd argue that some of the other items you list are actually not that beneficial, like planning for long-term evolution: The reality is that businesses evolve, and they might get a new big customer, or shift into a new line of business, that will necessitate major rewrites in the application anyway, so trying to plan for that from an engineering side is light folly. But it's mostly harmless, and sometimes helpful; and depending on your environment, maybe it would make sense.)
In particular, doing everything as shittily as possible is not beneficial to anyone. Users hate systems that flake out and don't work reliably, right? (At the same time, users might rather have a particular new feature that would save them an hour every day, rather than having you fix that one really thorny bug that's causing the system to need to be rebooted once a month. You'd rather have that, too, if you were them.)
So do stuff well, engage closely with your users and customers, think about their needs and goals, and then do the best you can to meet them, while communicating openly and honestly in a collaborative spirit, and committing as a team to high standards.
It really does work, in a way that a dedication to cynicism never will.
There are teams where the political consensus is that even considering security risks is useless - who aren't budged on that position when after violating PCI DSS and having a database full of plaintext payment card information and also having a shitty copy-pasted-from-the-internet PHP newsletter form with an SQLi have payment card info stolen and used in fraud. "They probably won't sue" so even just fixing the SQLi wasn't important to them.
There are teams where "SVN and Git are hard, so we just use Dreamweaver on the shared drive and use the built in file locking to make sure nobody steps on eachother's toes".
There are teams where plaintext FTP deployment to production sites on plaintext WIFI is standard operating procedure. I couldn't convince them to change it even after showing them the username and password in Wireshark. "Anyone in the neighborhood could steal all of our client's data." wasn't scary.
There are teams where leadership has no idea of technical realities, forms bad plans in the style of "We want to make Twitter, but for IoT thermostats" and gets to set the budget for those plans before even talking to a project manager or developer, and every initiative fails (doubly since they go over their nonsense budget, and have no nonsense customers buy into it) but it's fine because it's not like anyone will ever lose their job because they're 5 levels down from the CEO and five levels up from individual contributors in the software part of a hardware-focused fortune 500 so nobody in the C-suite understands or cares what they do and it's not consequential to the level where it shows up in shareholders reports.
There are teams where they use a CMS + custom fields features and pretend it's an MVC framework and build line of business apps with only a few models but internal storage abstraction of the CMS and custom field feature blows that up into hundreds of tables with mutiple-tens-of-ways joins, and normal usage starts to DoS it and nobody can accept that they get to re-architect or even at least fucking throttle requests, it's just "fix it", who knows how.
But if you work at a bad workplace and your takeaway is "this industry is completely broken" and you turn into a full-bore cynic who refuses to believe that anything better is possible, you've gone badly astray.
If there's part of the industry that's not like this, I haven't seen it and none of the people I've worked with have seen it, and I don't know it. At this point my wife has all but begged me to give up and settle for steady money with no purpose, my therapist is telling me to consider going back to school and pull a career change. I'm the only person I know in real life where there's any expectation that software makes sense and I question myself, wondering if pragmatic engineering in software is just a fantasy perpetuated by strangers on the internet.
I have been at one place that was good though, unfortunately I left it to relocate. I haven't found anyway remotely close to the same quality in they ~6 years since.
I've developed a few proxy questions to estimate exactly how shit they are though.
"Walk me through the steps of the your design process, what steps does software go through to get from conception to production on your team, who is responsible for each step, and how do they test the assumptions inherent in their designs?"
"Uh... well... <handwaving about how roles aren't defined so nobody's responsible, why wouldn't you be confident about your 'decisions', maybe 'design' is too strong a word?>"
Also, anywhere that uses TFS is an instant no, and I think SVN will be on that list now too.
It's not guaranteed, nothing is, but there are good working environments out there.
However, there is also the danger of having an engineer who is mired in trying to achieve some (often incoherent or misguided) state of perfection, guided by a religious commitment to an unspecified measure of "best", paralyzed by the sheer number of ways something could be improved in some conceivable way. He risks living in a bubble, disconnected from the larger goal and reality the software he is working on is a part of. This disconnect results in bad prioritization and little grasp of trade-offs. The idea of "long-term planning" is also problematic because, taken too far, can become an exercise in speculation and fortune-telling. As Woody Allen said, if you want to make God laugh, tell him your plans. You can aim in a general direction, but expect course correction. There is no "once-and-for-all".
Effective engineering requires prudence. Mature and seasoned engineers are better able to distinguish actual needs from possible needs or wants, make decisions and prioritize work based on the limited resources they have. There are programming techniques and approaches (if not wholesale methodologies) that are motivated by this wisdom and that enable an engineer to manage the evolution of his software.
Between the extremes, there is a range of reasonable opinion and approaches. To me, it sounds like the author is either working in an exceptionally bad company or suffers from OCD.
Edit, to add: This is by no means universal. I know and have enjoyed working with some very talented, humble, and empathetic engineers, too. I don't think most programmers have the attitude of the author of the article.
Well commented, thanks.
If you were hard working, ambitious and curious, there is a point (for me it took about 12 years after I started programming) when you realize that you know pretty much everything that there is to know about software. Anything that you don't already know is just tedium.
Being a software developer is tough, but then again, most jobs are. I do think that among the jobs that require advanced education, software engineering is definitely one of the toughest psychologically.
Software engineering damages you psychologically. The best software engineers that I know are also the most cynical people I know - All atheists, nihilists and pessimists (and sometimes downright depressed).
Being a software engineer can subject you to the full, ugly complexity of life.
Although I don't disagree with your statement regarding emotional consequences, I would argue that these personality traits are just as likely to be a predictor of someone that ends up becoming a software developer, rather than a side effect of doing the job for a number of years.
I can definitely speak for myself having been an atheist, nihilist and pessimist for quite a bit longer than I have been a software developer.
Psychologically speaking, debugging forces you confront and correct flaws in your reasoning. If you do it 10 to 100 times a day for 10 years or more, I think that your reasoning skills become a lot sharper.
I think you have a point though. Maybe it's more of a feedback cycle. Anyway, it's just a random thought.
This is an interesting claim. What do you mean by this?
The only people I've heard say this are those who are ignorant enough of the actual state of the art to think they've seen everything out there. If the field still has people researching it academically, you haven't seen everything under the sun.
When you're just starting out, learning $foo when all you ever knew was $bar is radical change that upends the world.
To the more experienced, learning about the existence of $foo is just another $whatsit with $properties and maybe $novel_feature.
Instead we get yet another generic build tool or MVC framework. React actually reminds me of writing php/asp code more than a decade ago.
I think it's coincidence, but that was around the same year I stopped getting good raises there. I quit after a couple years of that and went to get get paid what I'm worth. I still think it's because the new IT boss didn't like me. I was the only one that would stand up and say when a new policy was stupid. Still, I can no longer rule out the bug-fix thing, after reading your comment.
Spot on. Not to mention all the future debugging time you saved by deleting code.
I have trouble getting excited about "X has been broken for years" except in pretty special cases, e.g. code paths that only get exercised when your Mars lander is about to touch down.
One of the first, somewhat shocking, things I realized was that if I were to somehow rewrite the project code in such a way as to reduce the number of people required to work on it, no one would thank me. In fact, people would likely have gotten upset with me.
The folks who lost their jobs wouldn't thank me; the contractor who makes money from their billable hours wouldn't; the company managers wouldn't (their "stake" or whatever would be diminished by having fewer personnel under them); etc...
Basically there was a kind of local optimum: the code had to work and be maintainable enough so that no one looked too bad, but it couldn't work too well, nor be updated too easily, because then people would lose their status, revenue, or even jobs!
The internal logic of the system was mostly unconscious and hugely wasteful. I estimate (and I'm not the only one) that any three of us on the project could start over and reimplement the thing from scratch to feature-parity with the original in three months. (It is not a complicated or innovative thing.) After that, less than half of the current team could do the same maintenance and development. The rest of us could go do something else... But no one is interested.
Engineers often don't respect business and look down on management.
Instead of learning to talk and - more importantly - understand the language of business, developers frequently don't care about business requirements at all. Hence, more often than not they're not taken seriously and don't get to have a say about the direction a software product is going to take.
Instead of pushing back against unreasonable requirements or questioning why a particular requirement is even necessary in the first place, many developers resign themselves to acting passive-aggressively and keeping their mouths shut.
Why don't more software developers found their own companies if they're legitimately unhappy about their work environments? Why is it that often companies founded by software developers end up being the worst offenders in this respect?
It's also cherished, enshrined principles like 'reusability' that can lead to over-engineering and consequently both a deterioration in quality and failure to meet business requirements. As an engineer you should always be asking yourself: "Does what I'm about to implement have any merit or do I just think it does? Am I perhaps even just doing this as an exercise of proving how clever I am?"
That's true only if you have experienced engineers from a range of backgrounds. Put a bunch of junior devs on the project, and they'll prevaricate about issues such as "tabs vs spaces".
The whole article sounded too much like a rant. The problem is not "how do you build good software" but "how do you build software that's good enough to generate value, manage technical debt, and still make money?".
The privileged few who have not been forced into these situations should take a silent moment, and be thankful of their own luck.
For the rest of us, we'll just have to try to distance ourselves from our jobs, and let our wounds teach us.
>let us consider that being ‘blocked from making changes’ can actually be a very good and necessary thing. It’s something that the senior engineers of yesteryear once had the power to do. They sometimes did it out of spite, yes, but more often to keep code over which they had stewardship from being compromised by short-term thinking. Blockers were put up to ensure that software could be developed at a sustainable pace with the minimum of human suffering involved, and to be used as a check and balance against a management team not in a position to understand or learn about engineering trade-offs at stake.
Every time I've been blocked from immediately merging in my changes I've learned how to be a better developer. Yes there's a few times where it's been out of spite but the majority of the time it's led to conversations that have significantly improved my understanding of the code base and how to approach it and the culture of development at the company.
Have a spine and be willing to say no to plain old bad code.
It is pretty much the wild west of the economy that is fueled on lack of fair law to balance private interests vs public/consumers interests.
I've led phases of design trade-off analysis where the conclusions were essentially forgone at the start. But to humor the disbelievers, we spent a few months testing alternatives. Even after my team had loads of evidence that one design was more performant and durable (with proper patterns used), people in the engineering peanut gallery questioned our methodology, because the results were contrary to their preconceived notions. These guys were leads and architects, who largely seemed unconvinced because they didn't do the work, so it couldn't possibly be correct.
I want to contact my university and tell them to require some sort of "technical rhetoric" class in the curriculum. Appealing to emotion is really the only way to get things done in development when you tackle larger projects. No one believes empirical evidence anymore, nor do they care to follow good practices. It's mostly about leaving a turd behind, cashing out your RSUs after 3 years and letting the next guy worry about it.
Since the 1980's there have been numerous high profile projects that adhered to each successive software development methodology and imploded, often with rancorous finger pointing.
Business people as well as many software developers are attracted to the will-o-the-wisp that there is a one size fits all magic formula for software development.
Software development is extremely varied. Some projects are small. Some are large. Some, like flight avionics or medical radiation control software, require very high levels of quality and reliability. Others do not. "Quality" means different things to different people and in different situations.
Some software is like the bridge that you never want to collapse. Some software is like the plastic picnic cups that you use a few times and expect to break easily. It depends on the situation, the goals, the priorities which vary substantially and depend on human judgment.
Software developers are varied. What is "readable" code for one won't be readable for another. Perceptions of software designs reflect variations in culture, background, training, personality, and so forth.
There is no one size fits all methodology and attempting to impose one is often costly and disastrous.
Portraying the situation as it is may at least give us a better chance of coping with it. I doubt we can effect more than cosmetic changes.
Does not seem like good advice, or taking enough responsibility ("it's their fault I am semi-retired").
In fact, the whole article is a manifesto on how to shift blame onto external sources from oneself—projecting blame onto others and taking as little responsibility as possible.
Likewise, it's silly to make categorical statements to not take the blame for anything all the time.
Particularly with regard to how DEV is commoditised by management and the inevitable downfall should you choose to fight the good fight.
The money pressure from top simply engulfs technical rationale and makes priorities seem extremely short sighted. And should you want to make technical progress, by all means do by stuffing estimates, but it will be thankless.
Just because you know something doesn't mean you know everything. I doubt any top down approach can save you from all the negatives listed in this article, but I believe it could cause them. I believe it more after reading the article too. It's a strange conclusion to draw anyway.
Lower interest rates express a smaller time preference. Ceteris paribus, lower rates encourage risk taking. Longer-term bets are higher in risk, particularly when one considers principal-agent aspects.
Need to flesh them out..
Yeah, it was rude. But it does some up the end of some weeks.
And I think you mean "sum up" ;)
Great quote. I've seen some great code quickly turn to spaghetti under the guise of Collective Code Ownership.
>1) Business Thinking Favors the Short-Term — To an Extreme
Agreed that short-term thinking has problems. But the business environment changes, in some cases quite rapidly. And some software is only needed short-term. There's no business sense in spending a year developing software that can be maintained for a decade when it's only going to be used for 90 days (that is, if the deal goes through - if not, it will be scrapped without ever being used). Nor is it a good gamble to wait 2 years to get a system running when the competition can be building market share within 6 months.
If you're really good at seeing the long-term future, then you don't have this problem because you've already foreseen the winning lottery ticket or stock picks and are already retired wealthy. Right? You think you can foresee all business requirements and all requirements of all customers for the next 10 years?
>2) You Will be Crucified for Not Being a 'Team Player'
This will happen if you're incapable of working with other people. Or if you want to go off on your own and develop something not related to anything that is needed and you can't present any good reasons for doing so. If you want to do something that will make other people's lives easier or make them more successful, and can explain that to them, then the opposite happens. Even in backwards companies.
>3) The Software Architect is a Politician
As much as we all hate politics, the software is being developed for a business purpose and for use by end-users. It's not just a toy for narcissistic developers to sit around gold-plating.
>4) Suffering is the Commodity That you Provide
There is a bit of grunt-work and unpleasantness in software development. That's why it's called a job, instead of "Happy Happy Fun-Time". You're getting paid, you're not paying the company to do this.
>5) Your Peers Won't Support Change
Most will if it's reasonable. If it's as unreasonable as the article, they probably won't, but that's a good thing.
>6) Someone is Always Ready to Undercut You
This point seems backwards. Someone angling for promotion isn't trying to undercut you. Someone trying to undercut you is struggling for survival or trying to reach your level from a lower position. If you're threatened by either then you lack confidence.
>7) The Conscientious are Disenfranchised >Collective code ownership may be the most pernicious thing to happen to code since the advent of Javascript.
People with this mindset are inevitably fired due to their rudeness, hostility, arrogance, and utter inability to produce anything in any timeframe. They seem to believe that their whole job is not to develop software but to prevent the other developers from doing so. Good riddance.
>8) Methodologies Are Management Tools
Yeah, no surprise there, that's what they're for.
>9) You Will Think your New Team / Project is the Exception
More often developers are shocked by the problems that their new team has. They wonder why the team is doing everything the old-fashioned/wrong way and think that they have all the answers and can solve it. Real-world experience quickly solves that. Unless they can't handle the messiness of reality, in that case they go on to become disillusioned like the author of the article.
>10) It’s a Race to the Bottom — and No One Gives a Shit
There's a natural tension between spending years developing a worthless Enterprise Edition of "Hello World" vs. slinging up a quick-and-dirty app in a couple of weeks that turns out to be really valuable so that you might get stuck having to extend and support it for a decade or longer. There's no clear way to consistently hit the bulls-eye in the middle, with maximal value. All the loud voices preach one end of the spectrum or the other. Experienced people have mostly tuned them out, because they're both wrong.