Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ enableRobotsTXT = false
filename = "sitemap.xml"
priority = 0.5

[taxonomies]
tag = "tags"
author = "authors"

[params]
# In most cases you will only want to set the google_analytics_id OR the google_tag_manager_id.
# If you have Google Analytics included in your GTM tags don't put your GA ID here.
Expand Down
2 changes: 2 additions & 0 deletions content/blog/aws-ecs-fargate-vs-self-managed-ec2.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
---
title: "AWS ECS: FARGATE vs self-managed EC2"
authorIds: ["saumitra"]
authors: ["saumitra"]
date: 2024-08-13
draft: false
featured: true
weight: 1
tags: ["aws", "ecs", "fargate", "ec2"]
---

Cooking Up Cloud: Fargate or EC2—Which Kitchen Suits You?
Expand Down
2 changes: 2 additions & 0 deletions content/blog/building-internal-tools.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
---
title: "Building internal tooling in legacy systems"
authorIds: ["abhishek"]
authors: ["abhishek"]
date: 2024-04-11
draft: false
featured: true
weight: 1
sitemap:
changefreq: 'monthly'
priority: 1
tags: ["engineering", "legacy-systems"]
---


Expand All @@ -24,28 +26,28 @@
As every organization is a unique combination of different perspectives their systems/patterns also look different from each other at 10000 ft level. Due to these different perspectives they run into unique problems which any off the shelf tools can’t solve.
For e.g you need to build a authorization system for your internal CRM (security enhancement), where you are calling 100s of APIs to get and aggregate the data from multiple backend systems, in this case there will be different contracts, different kind of adoption of HTTP verbs and implementation and trust me you’ll be surprised day on seeing the permutation of variety HTTP that can exist in the system. After considering these ground realities organizations decide to build an internal tool which solves the problem and also fits in the processes.


Check failure on line 29 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Multiple consecutive blank lines

content/blog/building-internal-tools.md:29 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md012.md
## Horizontal cutting

Check failure on line 30 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Headings should be surrounded by blank lines

content/blog/building-internal-tools.md:30 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Horizontal cutting"] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md022.md
These kinds of problems are going to impact a lot of internal users from operations to engineers, there are going to be multiple key stakeholders from impact and collaboration point of view. What you are going to deal with is legacy and a process which is already adopted by the organization.

## Ownership

Check failure on line 33 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Headings should be surrounded by blank lines

content/blog/building-internal-tools.md:33 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Ownership"] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md022.md
These are going to be legacy systems/processes and your job is to build a tool to solve it, as this is going to be mostly processes which are leaky and tech debts, it's highly likely you are not going to have shared ownership between product manager/programme manager/engineer.


Check failure on line 36 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Multiple consecutive blank lines

content/blog/building-internal-tools.md:36 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md012.md
## Discovery

Check failure on line 37 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Headings should be surrounded by blank lines

content/blog/building-internal-tools.md:37 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Discovery"] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md022.md
As I said this is post PMF phase, most organizations miss out that these problems are going to hit you once you scale your product while they are majorly focussing on the growth of the business. So think about the problem which is compounding with time and suddenly gets prioritized while being on the back burner since the org existed. Most likely there would be no single person whom you can interview to understand all the use cases and problem statement. It’s going to be a fuzzy and blurred space which you have to navigate.


Check failure on line 40 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Multiple consecutive blank lines

content/blog/building-internal-tools.md:40 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md012.md
## Collaboration

Check failure on line 41 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Headings should be surrounded by blank lines

content/blog/building-internal-tools.md:41 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Collaboration"] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md022.md
Now that you have identified the problem statement and a solution, there are going to be situations where your solution is dependent on other teams and has some past context and history. Software is already a high collaborative work but in this case it might become a bottleneck for you.

## Execution

Check failure on line 44 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Headings should be surrounded by blank lines

content/blog/building-internal-tools.md:44 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Execution"] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md022.md
From an engineering point of view you are going to deal with a lot of tech debts, where it’s hard to navigate while executing the project, and you might end up breaking the existing systems or add more to the tech debts.

## Adoption

Check failure on line 47 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Headings should be surrounded by blank lines

content/blog/building-internal-tools.md:47 MD022/blanks-around-headings Headings should be surrounded by blank lines [Expected: 1; Actual: 0; Below] [Context: "## Adoption"] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md022.md
Adoption is going to be the toughest and most frictional part of the whole process where you need to move people from the existing process to the solution which you have built. You're definitely going to uncover something which you missed out in the analysis. As most of your users mostly won’t be having any incentive to move to a new tool, and it is going to take a lot of convincing for them to move.


Check failure on line 50 in content/blog/building-internal-tools.md

View workflow job for this annotation

GitHub Actions / lint

Multiple consecutive blank lines

content/blog/building-internal-tools.md:50 MD012/no-multiple-blanks Multiple consecutive blank lines [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md012.md
This is more or less the nature of work and what are some key problems you are going to face while building and rolling out an internal tool. As an engineer you need to operate in a certain way to overcome this problem as the problem space is dynamic and full of constraints which you can’t break.

Every system and process has flaws, and you need to be understanding and be patient while dealing with this as the organization has scaled to a certain level with the current systems and the processes around it. Nobody wants to do bad work but while the focus was on growth leadership was not able to prioritize and fix the gaps. Now that you are owning the problem statement organization has put faith in you to do the right thing. So think from an open mind and understand the constraint and situation of all the people who are using and maintaining those systems. This will help you to be calm as you are going to deal with a lot of unknowns and be comfortable in uncomfortable situations. One time while putting a code patch we encountered a JS file with more than 12k lines of code, we wanted to write tests for the patch we have put in but gave up after days of effort as the code dependency was quite huge and tightly coupled with the system. We had to give up on the discipline which we follow to make progress and such instances are going to be normal.
Expand Down
5 changes: 5 additions & 0 deletions hugo.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
port 1313 already in use, attempting to use an available port
Watching for changes in /app/{assets,content,data,layouts,static}
Watching for config changes in /app/config.toml
Start building sites …
hugo v0.145.0-666444f0a52132f9fec9f71cf25b441cc6a4f355+extended linux/amd64 BuildDate=2025-02-26T15:41:25Z VendorInfo=gohugoio
89 changes: 87 additions & 2 deletions layouts/blog/list.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
{{ define "body_classes" }}page-services-list{{ end }}

{{ define "main" }}
{{ .Scratch.Set "tag" (.Param "tag") }}
{{ .Scratch.Set "author" (.Param "author") }}
<div class="container">
<div class="row">
<div class="col-12 text-center mt-8">
Expand All @@ -10,8 +12,59 @@
</div>

<div class="container pt-6 pb-6">
<div class="row mb-4">
<div class="col-12">
<div class="d-flex justify-content-center">
<div class="mx-2">
<select id="tag-filter" class="form-select" onchange="filterPosts()">
<option value="">All Tags</option>
{{ range .Site.Taxonomies.tags.ByCount }}
<option value="{{ .Name | urlize }}" {{ if (eq ($.Scratch.Get "tag") (.Name | urlize)) }}selected{{ end }}>{{ .Name }} ({{ .Count }})</option>
{{ end }}
</select>
</div>
<div class="mx-2">
<select id="author-filter" class="form-select" onchange="filterPosts()">
<option value="">All Authors</option>
{{ range .Site.Taxonomies.authors.ByCount }}
<option value="{{ .Name | urlize }}" {{ if (eq ($.Scratch.Get "author") (.Name | urlize)) }}selected{{ end }}>{{ .Page.Title }} ({{ .Count }})</option>
{{ end }}
</select>
</div>
</div>
</div>
</div>

{{ $pages := .Pages }}
{{ $featured := where $pages "Params.featured" "eq" true }}
{{ $regular := where $pages "Params.featured" "ne" true }}

{{ $tag := .Scratch.Get "tag" }}
{{ $author := .Scratch.Get "author" }}

{{ if $tag }}
{{ $regular = where $regular "Params.tags" "intersect" (slice $tag) }}
{{ end }}
{{ if $author }}
{{ $regular = where $regular "Params.authors" "intersect" (slice $author) }}
{{ end }}

{{ if $featured }}
<div class="featured-posts">
<h2 class="text-center mb-4">Featured Posts</h2>
<div class="row">
{{ range $featured }}
<div class="col-12">
<div>{{ .Render "summary" }}</div>
</div>
{{ end }}
</div>
</div>
<hr class="my-5" />
{{ end }}

<div class="row">
{{ $paginator := .Paginate .Pages }}
{{ $paginator := .Paginate $regular }}
{{ range $paginator.Pages }}
<div class="col-12">
<div>{{ .Render "summary" }}</div>
Expand All @@ -22,4 +75,36 @@
{{ partial "pagination.html" . }}
</div>
</div>
{{ end }}

<script>
function filterPosts() {
const tag = document.getElementById('tag-filter').value;
const author = document.getElementById('author-filter').value;
let url = '/blog/';
const params = new URLSearchParams();
if (tag) {
params.append('tag', tag);
}
if (author) {
params.append('author', author);
}
const queryString = params.toString();
if (queryString) {
url += `?${queryString}`;
}
window.location.href = url;
}

document.addEventListener('DOMContentLoaded', () => {
const params = new URLSearchParams(window.location.search);
const tag = params.get('tag');
const author = params.get('author');
if (tag) {
document.getElementById('tag-filter').value = tag;
}
if (author) {
document.getElementById('author-filter').value = author;
}
});
</script>
{{ end }}