Tammy Hart

Product Engineer

From hobby to career, my love for frontend development is where it all began

TypeScript

My first introduction to JavaScript was through jQuery. It was the go-to solution for web development back then. Being able to manipulate the DOM and create effects and interactions not possible with HTML and CSS alone had a strong attraction to me.

When I changed career paths to software engineering, jQuery was barely relevant. I couldn’t rely on it and had to grow stronger in vanilla JavaScript alongside the libraries and Frameworks I was using.

Finally, TypeScript entered my life when I joined a company that had a vast library of type definitions and strict standards around using the tool. I was able to pick up a good understanding of it rather quickly, especially as I began to benefit from using it.

While I will ignore it and just use JavaScript for very small code exercises, TypeScript is my language of choice for large projects and foundations. I feel the pros outweigh the cons and it’s worth anyone’s while to learn and use.

Pros

Static Typing

  • Error Detection: Catching errors at compile time rather than at runtime helps in reducing bugs

  • Code Quality: Enforces type safety which improves code quality and maintainability

  • Tooling Support: Enhanced IDE support with features like autocompletion, type checking, and navigation

Improved Readability and Maintainability

  • Explicit Types: Makes the code more readable and understandable

  • Self-Documenting: Types serve as documentation, making it easier for new developers to understand the codebase

Cons

Learning Curve

  • Initial Overhead: Requires learning TypeScript-specific syntax and concepts, which can be a hurdle for new developers

  • Complexity: Can add complexity, especially for small projects or simple scripts

React

While my first software job was on an Angular team, I got the role due to my proven ability to learn and adapt quickly. I demonstrated this during the interview process by guiding the people on the call through a React app I had designed and built while learning the library.

I was strongly drawn to JSX as a solution versus templates. I like how content, layout, and functionality all happen in a way that is natural to HTML. There are no proprietary attributes to learn such as those in frameworks that prefix features with the framework name or abbreviation. Want something to happen on click? You can just use onClick! Want conditional content? Use ternaries right in the markup!

I find creating and maintaining a React app to be smooth and easy to understand, especially when being introduced to a new-to-me codebase.

Pros

Component-Based Architecture

  • Reusability: Components can be reused across different parts of the application, reducing duplication and effort

  • Modularity: Encourages separation of concerns, making the codebase more manageable and scalable

Virtual DOM

  • Performance: Efficiently updates and renders components, leading to high performance in large-scale applications

  • Minimal DOM Manipulation: Reduces direct manipulation of the DOM, which can be error-prone and slow

JSX Syntax

  • Readability: JSX combines JavaScript and HTML, making the code more readable and easier to understand

  • Declarative: Encourages a declarative programming style, making UI logic more predictable and easier to debug

Strong Ecosystem

  • Community Support: Large and active community provides a wealth of resources, tutorials, and third-party libraries

  • Tooling and Libraries: Rich ecosystem of tools like Create React App, React Router, and state management libraries (e.g., Redux, MobX)

Cons

Learning Curve

  • Complexity: Can be difficult for beginners to learn, especially with advanced concepts like hooks, context, and higher-order components

  • JSX: Some developers may find JSX syntax unfamiliar or cumbersome

State Management Complexity

  • Multiple Approaches: Various ways to manage state (e.g., Context API, Redux, MobX), which can be confusing and lead to inconsistency

  • Boilerplate Code: State management solutions like Redux can introduce a lot of boilerplate code, making the codebase more complex

SEO Challenges

  • Client-Side Rendering: Out-of-the-box React may not be optimal for SEO, although this can be mitigated with SSR frameworks like Next.js

Strapi

When I was first introduced to WordPress back before it earned the ability to be called a Content Management System, it launched me into a career I didn’t know I could achieve.

Having the ability to manage content separate from markup, was revolutionary, not to mention the ease in which you could keep your code DRY.

Fast forward to my software years and I’m still impressed with WordPress’s strong ecosystem, the standards and policies the team of contributors hold that helped shape me into a stronger programing discipline, and the features. It has so. many. features.

What I’m not fond of, is PHP. Yes, you can go headless since they introduced the REST API, but it kinda negates a lot of the power that you get from the templating system and even permalinks.

So much WP talk, what about Strapi?

Since I love writing SPA’s with React, I easily fell in love with Strapi, its strong content type and dynamic zone features, and the fact that it’s all JavaScript, baby!

While I have a healthy list of cons below, the only ones that give me a slight pause are the performance concerns and vendor lock-in.

Pros

Headless CMS

  • Decoupled Architecture: Allows you to use any front-end framework or technology to consume the content via RESTful or GraphQL APIs

  • Flexibility: Suitable for a wide range of applications, from websites to mobile apps and beyond

Customization and Extensibility

  • Customizable Admin Panel: Easily customize the admin interface to fit specific needs

  • Plugins and Middleware: Extend functionality through a rich ecosystem of plugins and middleware, or develop custom ones

API Support

  • RESTful and GraphQL APIs: Offers both RESTful and GraphQL APIs out of the box, providing flexibility in how content is consumed

  • Customizable APIs: Allows you to customize and extend the generated APIs to meet specific requirements

Content Types and Dynamic Zones

  • Content Type Builder: Provides a user-friendly interface for creating and managing content types and fields

  • Dynamic Zones: Allows the creation of flexible and reusable content structures, enhancing the ability to manage complex content

Localization and Internationalization

  • Multi-Language Support: Built-in support for managing content in multiple languages, catering to global audiences

Cons

Performance Overhead

  • Heavyweight: Strapi can be resource-intensive, especially for high-traffic applications, potentially leading to performance issues

  • Server Requirements: Requires a robust server environment, which can increase hosting costs

Learning Curve

  • Complexity: While the admin interface is user-friendly, understanding and customizing the backend codebase can be complex for beginners

  • GraphQL Complexity: Using GraphQL effectively may require additional learning for those unfamiliar with it

Limited Built-in Features

  • Basic Features: Out-of-the-box features may be limited for certain use cases, requiring additional customization or plugin development

  • Plugin Dependency: Reliance on third-party plugins for extended functionality, which may vary in quality and support

Vendor Lock-in

  • Strapi-Specific Code: Heavy customization might lead to vendor lock-in, making it challenging to switch to another CMS without significant refactoring

Feature Flags

The beauty of the internet is that it’s a living document — always evolving. Software is no exception. Gone are the days of buying hard copies and then again when a new version is released. Today, updates roll out continuously, from hot-fixes to major releases, often without users even noticing.

Managing this constant iteration and measuring its impact is crucial. If we’re always shipping new features, overwriting old ones, or juggling long-lived branches against a fast-moving main, chaos can take over.

This is where feature flags have become one of the most valuable tools in modern development. Features can be shipped to production but remain “off” until ready. A broken update can be switched off instantly while a fix is found. Best of all, we can track multiple variations of the same feature to see which drives better outcomes in conversion, retention, or engagement.

I’ve enjoyed using tools like LaunchDarkly to bring this practice into real projects. When managed carefully — especially avoiding the tech debt of stale flags — feature flagging is a powerful lever for growth and success.


Pros

Decoupling Deployment from Release

  • Safe Rollouts: Release features gradually to a subset of users before making them widely available

  • Instant Rollback: Turn off a problematic feature without redeploying the codebase

Experimentation and Testing

  • A/B Testing: Compare variations of a feature in real-world conditions and make data-driven decisions

  • Beta Testing: Give access to specific user groups to gather feedback before general release

Improved Developer Workflow

  • Continuous Delivery: Merge unfinished features behind flags, reducing long-lived branches and integration headaches

  • Parallel Development: Multiple features can be developed concurrently without blocking releases

User Segmentation

  • Targeted Experiences: Enable or disable features for different audiences (e.g., geography, subscription tier, or device type)

Cons

Increased Code Complexity

  • Flag Sprawl: Too many flags can clutter the codebase and make logic harder to follow

  • Dead Code: Old or forgotten flags can stick around, creating unnecessary technical debt

Testing Overhead

  • Multiple States: Every flag combination potentially creates a different application state that needs validation

  • QA Burden: Ensuring test coverage across flag variations can be time-consuming

Performance Considerations

  • Conditional Rendering: Extra logic for flags can impact runtime performance if not implemented efficiently

  • Remote Config Delays: If flags depend on network calls, they can introduce latency before UI decisions are made

Operational Challenges

  • Governance: Requires discipline and tracking to avoid "flag rot" where old flags linger indefinitely

  • Tooling Costs: Enterprise-grade feature flagging platforms can become expensive as projects scale