Personal Blog & Dev Journal

Chewing the programming fat

Kilt and Code is the personal website of Steven McLintock, a Scottish full stack developer based in Stratford, Ontario. He writes about .NET, C#, Angular, TypeScript, and JavaScript — the tools he uses every day.

A personal website is more than a digital business card. It is a space where ideas can be explored, tested, and shared without the constraints of social media platforms. For a developer, it becomes a living portfolio that demonstrates not only technical skill but also the evolution of thought over time. The act of writing about code forces clarity, revealing gaps in understanding and solidifying concepts that might otherwise remain hazy. This site exists in that spirit, as a quiet corner of the web where programming topics are chewed over at a deliberate pace, away from the noise of trending feeds and algorithm-driven timelines.

Full stack development demands a willingness to move fluidly between layers of abstraction. One moment you are reasoning about database indexes and query execution plans, the next you are styling a form component or wiring up a reactive data flow in the browser. This constant context-switching is not a bug but a feature of the discipline. It cultivates a holistic understanding of how software systems actually function, from the metal to the pixel. The modern web stack, with its sprawling ecosystem of frameworks and tooling, rewards those who can hold the entire picture in their head while still drilling deep into any single layer when the situation demands it.

Angular provides a structured, opinionated framework that suits developers who value consistency across large codebases. Its component architecture encourages a clear separation of concerns: parent components orchestrate data flow while child components handle presentation and user interaction. Communication between these layers, whether through Input bindings or Output EventEmitters, becomes a deliberate design choice rather than an afterthought. Managing state across deeply nested component trees requires discipline, and Angular's built-in patterns offer guardrails that help teams avoid the tangled mess of implicit data sharing that can plague less structured front-end architectures.

TypeScript brings a welcome layer of safety to the inherently chaotic world of JavaScript. By catching type errors at compile time rather than at runtime, it shifts the debugging experience from frantic console spelunking to calm, editor-based feedback. Interfaces and generics allow developers to model domain concepts with precision, turning what might have been a vague object into a well-documented contract. The language does not eliminate the need for testing, but it does reduce an entire category of trivial bugs that would otherwise slip through. For anyone maintaining a codebase beyond a few thousand lines, the value proposition becomes undeniable.

Reactive forms in Angular represent a different philosophy from their template-driven counterparts. Instead of delegating form logic to directives scattered across the HTML, reactive forms keep the entire form model in the component class, where it can be tested, watched, and transformed programmatically. This approach shines when validation requirements grow complex. Custom validators can be composed and reused, error messages can be derived from the form control state, and the entire validation pipeline becomes a transparent, debuggable process rather than a black box of template magic.

Database work is often the quiet backbone of application development, underappreciated until something goes wrong. Writing SQL by hand, rather than relying solely on an object-relational mapper, keeps a developer grounded in the actual shape and behaviour of the data. Tasks like generating test data, scripting insert statements, or backing up tables through SQL Server Management Studio may seem mundane, but they build an intuition for how the engine thinks. That intuition pays dividends when queries slow down, locks pile up, and the abstractions that once felt convenient suddenly feel like walls.

Immigrating from Scotland to Canada reshapes a person in ways both subtle and profound. The journey from Glasgow or Edinburgh to Toronto, and then onward to a smaller city like Stratford, Ontario, carries the weight of leaving behind familiar landscapes, accents, and social rhythms. There is a particular kind of learning that happens when you rebuild your daily life in a new country, a forced adaptability that seeps into everything else. The experience of being a newcomer, of navigating unfamiliar systems and finding your footing, parallels the developer's constant state of learning new languages and frameworks on a daily basis.

Writing about software development practices forces a reckoning with what you actually believe versus what you have simply absorbed from blog posts and conference talks. Unit testing, for example, is easy to advocate for in the abstract but genuinely difficult to implement well. Tests that are brittle, slow, or tightly coupled to implementation details can become a liability rather than a safety net. The goal is not merely to hit a coverage percentage but to write tests that give you the confidence to refactor boldly. Bulletproof validation and meaningful error messages are not afterthoughts; they are the product.

A static site generator like Jekyll strips away the complexity of databases and server-side rendering, reducing a website to its essence: content, layout, and a build step. Writing posts in Markdown and letting the generator produce a flat collection of HTML files is a refreshing return to simplicity after years of wrestling with content management systems. The archives of a blog, ordered by date and tagged by topic, become a searchable personal knowledge base. An RSS feed keeps the door open for readers who prefer to consume content on their own terms, without algorithmic interference.

Latest Article

A matte gouache poster painting of a warm amber and deep charcoal abstract composition with angular geometric shapes suggesting code blocks and data flow, set against a cream background
Angular TypeScript Components
Using Angular's EventEmitter to Share Data Between Child and Parent Components

There are often scenarios in Angular where we need to communicate between components — specifically, sending data from a child component to its parent. This article walks through a practical example using an Angular 12 to-do list app.

By Steven McLintock · August 8, 2021

More Writing

A matte gouache poster painting in warm terracotta and charcoal, with geometric grid patterns evoking cloud infrastructure and batch processing pipelines
Azure C# Cloud
How to Use Azure Batch Job Schedule

A follow-up guide on setting up recurring job schedules in Azure Batch — creating pools, application packages, and automating large-scale code execution.

March 3, 2019