Skip to content
v1.1
Blog
Back to all articlesWeekly Thoughts
Weekly Thoughts
Sep 7, 2026 · 5 min read

What I Learned Building My Own Portfolio as a Product

I built my portfolio as an interactive conversational product rather than a static resume: ask a question and get authentic answers about my work.

#frontend#career#dx

What I Learned Building My Own Portfolio as a Product

Sep 7, 2026 5 min read Faisal Al Isfahani
#frontend#career#dx
“I built my portfolio as an interactive conversational product rather than a static resume: ask a question and get authentic answers about my work.”

Building software in fast-paced production environments forces engineers to confront trade-offs every single day. What looks clean in a textbook often reveals unexpected edge cases under real-world traffic.

When working across complex codebases at scale, maintaining clear mental models and strict team conventions is what separates sustainable architectures from fragile code.

The Real-World Challenge

When teams rush to ship features without aligning on core architectural principles, technical debt accumulates quietly:

  • Coupled Side-Effects: Logic and state mutations leaking into presentation templates.
  • Premature Abstraction: Writing wrapper utilities for single-use functions before understanding the problem domain.
  • Unverified Third-Party Dependencies: Adding heavy external npm packages for simple tasks that native browser APIs already solve.

Practical Engineering Solution

Here is an idiomatic implementation pattern designed to address this challenge cleanly:

typescript
// Resilient Enterprise Circuit Breaker & Boundary Handler
export async function executeServiceTask<T>(
taskFn: () => Promise<T>,
options = { maxRetries: 3, backoffMs: 500 }
): Promise<T> {
let attempt = 0;
while (attempt < options.maxRetries) {
try {
return await taskFn();
} catch (err) {
attempt++;
if (attempt >= options.maxRetries) throw err;
await new Promise(res => setTimeout(res, options.backoffMs * attempt));
}
}
throw new Error("Service execution failed after retries");
}

Critical Takeaways

  1. Keep Code Readable: Code is read 10 times more often than it is written. Plain, explicit code is easier to audit, debug, and refactor.
  2. Test Critical Paths: Focus automated unit and integration tests on high-risk business logic and data boundaries.
  3. Build for the Next Developer: Write documentation and component APIs with clear inputs, outputs, and type guarantees so your team can move fast with confidence.
Official Specifications & References
Faisal Al Isfahani

Faisal Al Isfahani

Senior Software Engineer with 5+ years of experience—always learning, caring deeply about code craft, and building web products that matter.

Suggested Next Reads

View all articles
Weekly Thoughts5 min read

Five Things I Wish I'd Known When I Started as a Frontend Engineer

One: The browser is your runtime. Learn it, not just the frameworks that run in it.

Read article
Weekly Thoughts5 min read

I Reviewed 200 PRs This Year. Here's What I Look For First.

After reviewing over 200 pull requests this year, here is what I look for first: context clarity, test coverage, and modular boundaries.

Read article