Career

What 15 Years of Web Development Taught Me

Jeffrey Davidson · · 6 min read

The Long View

Fifteen years. I've been thinking about that number a lot lately. When I started building websites, jQuery was revolutionary, responsive design wasn't really a thing yet, and deploying meant FTPing files to a shared hosting account. I've watched frameworks rise and fall. I've seen PHP go from the punching bag of the internet to a genuinely excellent modern language. I've written code I'm proud of and code that should probably be classified as a war crime.

Here's what I've learned. Not just the technical stuff (though there's plenty of that) but the broader lessons about building a career in this weird, wonderful, constantly-shifting industry.

1. The Fundamentals Don't Change

Languages come and go. Frameworks come and go. But the fundamentals never change. Data structures, HTTP, SQL, how the request/response cycle works, basic security principles: those are essentially permanent. I've seen developers who could spin up a React app in five minutes but couldn't explain what a POST request actually does. That's building on sand.

Early in my career, I skipped over fundamentals to chase whatever was shiny. I learned Laravel without really understanding MVC. I used Eloquent without knowing SQL. It caught up with me. Every time. When things broke, I didn't have the mental model to debug them. I was just pattern-matching against Stack Overflow answers.

If I could go back and tell 2011 Jeffrey one thing, it would be: slow down, learn how the underlying technology works, then learn the framework. You'll be faster in the long run.

2. Boring Technology Is Usually the Right Choice

There's a famous blog post called "Choose Boring Technology" by Dan McKinley. If you haven't read it, go read it. I'll wait.

The gist is that you have a limited budget for novelty. Every new, unproven technology you adopt comes with a cost: unknown failure modes, missing documentation, smaller community. Sometimes that cost is worth it. Usually it isn't.

I've been burned by choosing the exciting option more times than I care to admit. Exotic databases, bleeding-edge JavaScript frameworks, fancy deployment tools that sounded great in a conference talk and turned into maintenance nightmares in production. Meanwhile, the boring apps (MySQL, Laravel, a straightforward VPS) just kept chugging along.

This doesn't mean never try new things. It means be honest about why you're trying them. Is it because the project actually needs this technology? Or is it because you're bored and want to play with something new? Those are different motivations, and they lead to different outcomes.

3. Testing Is Not Optional (But It Took Me Years to Believe That)

I didn't write tests for the first several years of my career. I told myself the usual excuses: the project is too small, the deadline is too tight, I'll add tests later. "Later" never came.

The turning point was Adam Wathan's Test Driven Laravel course. I'd heard people talk about testing for years, but it always felt like extra work with no clear payoff. Then I watched Adam build a real application test-first, and something clicked. It wasn't about writing tests after the fact to check boxes. It was about using tests to drive the design. The code that came out of that process was cleaner, more intentional, and easier to change. I was sold.

I started writing tests the next day. First with PHPUnit, which felt clunky and verbose. Then Pest came along and made testing feel like it actually belonged in my workflow. Pest's syntax is clean, expressive, and (this matters) enjoyable. I actually look forward to writing tests now, which is something I never thought I'd say.

If you're not testing, you're not being professional. I know that sounds harsh. I don't care. Write the test. Future you will send a thank-you card.

4. Code Is Communication

This took a long time to sink in. When you're junior, you think code is instructions for the computer. It is, technically. But more importantly, code is communication between humans. The computer doesn't care if your variable is called $x or $customerEmailVerificationStatus. The next developer reading your code at 11 PM on a Friday absolutely cares.

I obsess over naming now. I refactor for clarity more than for performance. I write code that tells a story. You should be able to read a controller action and understand the business process without jumping to six different files.

This is also why I've moved toward patterns like Action classes and descriptive method names. CreateSubscription::handle($user, $plan) reads like a sentence. It tells you exactly what's happening. That's not an accident. That's intentional communication.

5. Your Architecture Should Earn Its Complexity

I've gone through phases. Early on, everything was simple because I didn't know any better. Then I discovered design patterns and made everything absurdly complex: repositories wrapping repositories, interfaces for everything, abstraction layers that abstracted nothing. Then I swung back to simplicity, but this time intentionally.

Here's my rule now: start simple. Use Laravel's built-in patterns: controllers, models, form requests, policies. When a specific part of your app starts getting messy, then introduce more structure. Extract a service class. Create an action. Add a DTO. But do it because you have a real problem, not because you read a blog post (irony noted) about hexagonal architecture and got inspired.

Premature abstraction is just as dangerous as premature optimization. Possibly more so, because it makes your code harder to understand without making it any more correct.

6. Soft Skills Are Not Soft

I hate the term "soft skills" because it implies they're less important than technical skills. They're not. They might be more important.

The ability to communicate clearly, to listen, to manage expectations, to say "I don't know" without shame, to give and receive feedback, to write a coherent email. These are career-defining skills. I've watched brilliant developers stall out because they couldn't work on a team. I've watched average developers advance because they were great communicators who made everyone around them more effective.

If you want to level up your career and you're already technically competent, invest in communication. Take a writing course. Practice presenting. Learn to explain complex things simply. That's where the leverage is.

7. Take Care of Your Body

This one's personal, but I think it matters. For years, I treated my body like it was just a vehicle for getting my brain to the keyboard. Sitting in a chair for 10+ hours a day. Not exercising. Eating garbage. I told myself I'd deal with it later, that the work was more important.

Your career is a marathon, not a sprint. If you burn out physically, all the technical skill in the world won't help you. Get a standing desk. Take walks. Drink water. Get your blood work done. This stuff isn't sexy, but neither is a health crisis at 40.

8. The Community Matters More Than the Technology

I've stayed with Laravel for a lot of reasons: the elegant syntax, the ecosystem, the constant innovation. But if I'm being really honest, the biggest reason is the community. The Laravel community is, by and large, welcoming, generous, and genuinely helpful. Laracasts. Laracon. The Discord servers and forums. The package authors who maintain open-source tools for free because they believe in the ecosystem.

When you choose a technology, you're also choosing a community. You're choosing who you'll learn from, who you'll ask for help, who you'll collaborate with. Choose a community that makes you better.

9. Ship It

Perfectionism is a career killer. I've sat on projects for months, tweaking and refining, waiting until everything was "ready." Meanwhile, someone else shipped something half as polished and learned twice as much from real-world feedback.

Ship it. Get it in front of users. Learn from what actually happens instead of what you imagine will happen. You can iterate. You can improve. You cannot improve something that only exists on your local machine.

10. Stay Curious, Stay Humble

Fifteen years in, I still learn something new every week. Not because I'm some paragon of lifelong learning, but because this industry demands it. The moment you think you know enough is the moment you start falling behind.

But it's more than that. Staying curious keeps the work fun. The day I stop being excited about a new Laravel feature or a clever Pest assertion or an elegant bit of architecture is the day I should find a different career.

I don't have it all figured out. I'm better than I was five years ago, and I'll be better five years from now. That's the deal. That's the journey.

And honestly? I wouldn't trade it for anything.