Kevin Clark
I'm a React Developer
About
Skills
Hello! 👋 I'm Kevin. I'm a senior-principal level software developer who loves building thoughtful, well-crafted web applications.
Over the years, I've worked across the full stack, partnering with product, design, and engineering teams to turn complex ideas into intuitive, reliable software. I'm especially drawn to modern technologies and frameworks that enable fast, responsive user experiences — but I'm equally comfortable stepping into legacy systems, untangling complexity, and leaving codebases cleaner and more sustainable than I found them.
My work leans about 60/40 toward the front end, which means I spend a lot of time thinking about usability, accessibility, performance, and the subtle details that shape how people experience software. At the same time, I enjoy the architectural and back-end challenges that make those experiences possible — designing APIs, improving system reliability, and making pragmatic decisions that balance scalability with simplicity.
TypeScript is my language of choice, and I'm passionate about building maintainable, well-structured systems that stand the test of time. I care deeply about code quality, clear abstractions, and thoughtful design — not for their own sake, but because they enable teams to move faster and build with confidence.
Above all, I value craftsmanship, collaboration, and continuous improvement. Great software isn't just about shipping features — it's about solving the right problems in ways that are sustainable, elegant, and genuinely useful.
Resume
Here is a brief summary of my last few roles. For my full professional experience, please download my resume.
Education
M.S, Management Information Systems, MBA Concentration
2008 - 2010
Florida State University, Tallahassee, FL (Online)
B.S, Management Information Systems, Minor Computer Science
2000 - 2004
Florida State University, Tallahassee, FL
Professional Experience
Costar Group - Senior Software Engineer
10/2025 - Present
San Diego, CAICF, International - Principal Software Engineer
06/2022 - 06/2025
RemoteloanDepot - Senior Software Engineer
09/2020 - 06/2022
RemotePortfolio
These are just some fun projects I have done in my spare time for practice - please don't judge them too harshly! 😅
Blog
After 20+ years of coding, I've developed (no pun intended) a lot of opinions on what I think works, and what doesn't work. Here are a few of them...thanks for reading! 😁
Don't Put Database Access In Logic Functions
Directly embedding database access in logic functions is a clear anti-pattern that compromises key software qualities. By embracing separation of concerns and clean architectural boundaries, developers can build systems that are easier to maintain, test, and evolve over time. For teams striving toward clean code and robust systems, this pattern is worth avoiding early and often.
Denormalizing Should Be Normalized
Denormalization shouldn't be treated as a dirty word. Like any tool, it has its place. If you're building a system where certain reads are expensive and consistent patterns emerge, it's worth asking: Can I store this value once, rather than computing it every time? The next time you're designing a schema or troubleshooting a slow query, consider where a little denormalization might go a long way.
Don't Mix Logic In Your Transport Layer
Mixing logic within your transport layer, i.e. your middleware or routers/controllers, makes unit testing logic more difficult, in addition to making it much more difficult to change transport layers (i.e. self-hosted to serverless). Avoiding logic in controllers or middleware isn't just about code cleanliness—it's about flexibility, testability, and long-term maintainability.
Use Narrowly Defined Interfaces For Easier Testing
Narrowly defined interfaces allows for simpler and more
maintainable tests, reduced coupling between components,
greater flexibility in refactoring, and clearer intent in your
code. If you're working with TypeScript, consider reaching for
Pick (and friends like Omit,
Partial, etc.) more often. You'll write leaner,
cleaner, and more robust code.
Interfaces For Agility And Testability
Interfaces are essential for building robust, testable, and adaptable software. They enable mocking for unit testing without relying on heavy or stateful dependencies. They decouple consumers from implementations, reducing impact of change. And they improve agility and support scaleability by allowing one to change concrete dependencies much easier.
From Modular Monolith To Microservices
Jumping straight from a traditional monolith to microservices can be risky and complex. If you have clean domain segregation, and as much segregation as possible with your transport and infrastructure layers, you can make the switch to microservices a lot less painful.
Testimonials
Here are some things people have said about working with me: