← Back to Journal

Reflections

What matters the most for me after 15 years of experience — reflections triggered by AI integration

Petro Lashyn Jan 29, 2026 5 min

On simplicity, boundaries, and building software that lasts.

A short reflection on structure, simplicity, and experience

Recently, I faced a task that made me pause and reflect on one of my larger projects.

But very quickly, it became clear that I wasn't just reflecting on the project itself — I was reflecting on my approach to building software in general.

Over the years, I've worked in many roles: PHP developer, Laravel developer, software architect, DevOps, frontend developer, full-stack developer. Sometimes all of them at once. Sometimes by choice, sometimes because the project demanded it.

When I didn't know something, I figured it out. At first with Stack Overflow, experiments, patterns, and trial and error. Later with frameworks, best practices, and philosophies. SOLID, DRY, KISS. Object-oriented programming, abstractions, factories, contracts, interfaces. Mixing Laravel with ideas from Symfony. Falling back to simple MVC when it made sense.

I've worked on single-page applications across different generations: early Angular, then Vue, then Vue 3 with a completely different paradigm. React, TypeScript, Tailwind, Inertia. Domain-driven design. Layered architectures. Large projects with many models and tables, APIs, dashboards for different actors, background jobs, console scripts, and integrations — all sharing the same core.

I didn't build unicorns.

I didn't work in Big Tech.

But for more than 15 years, I've worked on real projects — SaaS, CRM, ERP, small pet projects, experimental ones — and many of them are still running today.

Why I started reflecting more consciously now

The real trigger for this reflection was AI.

I've recently started using AI as a serious resource in my development process — not as a toy, but as a tool to speed up work, explore solutions, refactor code, and challenge my own decisions.

AI has an interesting side effect: it forces you to be explicit.

If your architecture is blurry, AI amplifies the blur.

If responsibilities are mixed, AI happily generates more mixed logic.

If boundaries are unclear, everything starts leaking everywhere.

That's when I realized: this is a good moment to consciously draw boundaries, simplify decisions, and reflect on what actually matters in my daily work as a developer.

After compressing all that experience, I ended up with just three simple statements.


1. Keep it simple, Smart

This sounds obvious, but it's still the most important thing.

KISS really works.

Not "simple" in a dumb way — but simple in a smart, intentional way. So literally, Keep It Simple, Stupid Smart.

When you come back to a piece of code after a year — to add a feature, debug a strange 500 error, or adapt to new business logic — simplicity becomes priceless. If the code is straightforward, you immediately understand what's going on. You don't need to re-learn layers of abstractions or trace hidden flows.

Simple code is easier to maintain.

Simple code is easier to debug.

Simple code is easier for others to work with.

And future you is also "someone else".

2. Separate concerns and make the structure explicit

Simplicity does not mean chaos.

It's extremely important to separate concerns and build a clear structure — whether it's a Laravel project, a package, or a Vue SPA.

How you do this is up to you: frameworks, patterns, naming, folder structure. That part is personal. But once you choose a structure, it must be logical and predictable.

You should clearly understand:

  • where responsibilities live,
  • how data flows through the system,
  • how actors move through the application.

The system should be decomposed into layers that can live independently: application layer, domain or service layer, view or view-model layer. These layers should communicate through well-defined boundaries and be replaceable.

You should always have a clear picture in your head of how the flow moves through these layers and what exactly happens in each of them.

3. Have a single source of truth

This principle connects everything above.

A single source of truth works beautifully — and it's closely related to both separation of concerns and simplicity.

For example, when you perform mutating operations on a model — creating records, updating fields, deleting data, changing state — there should be one clearly defined place where this logic lives.

Not spread across controllers, services, jobs, and helpers.

Not duplicated in slightly different forms.

The same applies to reading data, orchestration, business rules, and configuration. Each concern should have its own source of truth.

When you work this way:

  • behavior becomes predictable,
  • systems become easier to reason about,
  • changes become safer.

You always know where to look.

You always know what to change.


Final note

None of these thoughts are new or revolutionary.

But they are the things that, based on my experience, really matter for my work today. They help me stay productive, calm, and confident when working on real projects — especially now, when AI is part of the development process.

This is simply what works for me.

Glad to hear your reflections! And thanks for an attention!

Thanks for reading.

Back to Journal

Stay Updated

Join the mailing list for technical discourse, architectural logs, and research notes. No spam, ever.