<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Jakes Alvin]]></title><description><![CDATA[Documenting my journey to becoming a world-class Software & Systems Engineer.]]></description><link>https://amjakes.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!Fehi!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7923271f-d71e-427f-9547-a9e02c1126e6_800x800.jpeg</url><title>Jakes Alvin</title><link>https://amjakes.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 05 Jul 2026 04:22:02 GMT</lastBuildDate><atom:link href="https://amjakes.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jakes Alvin]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[amjakes@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[amjakes@substack.com]]></itunes:email><itunes:name><![CDATA[Jakes Alvin]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jakes Alvin]]></itunes:author><googleplay:owner><![CDATA[amjakes@substack.com]]></googleplay:owner><googleplay:email><![CDATA[amjakes@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jakes Alvin]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Building Skyline Computer World: Why Great Software Starts with Architecture, Not Features]]></title><description><![CDATA[Laying the Foundation Before Writing Features]]></description><link>https://amjakes.substack.com/p/building-skyline-computer-world-why</link><guid isPermaLink="false">https://amjakes.substack.com/p/building-skyline-computer-world-why</guid><dc:creator><![CDATA[Jakes Alvin]]></dc:creator><pubDate>Fri, 03 Jul 2026 19:27:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Fehi!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7923271f-d71e-427f-9547-a9e02c1126e6_800x800.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Building Skyline Computer World</h1><p>Over the past few weeks, my focus hasn&#8217;t been on building flashy user interfaces or adding features.</p><p>Instead, I&#8217;ve been working on something less visible but far more important: <strong>building the foundation that every scalable software system depends on.</strong></p><p>As the project leader for <strong>Skyline Computer World</strong>, my responsibility has been to ensure that our team starts with the right architecture instead of rushing into development. Good software isn&#8217;t just about writing code&#8212;it&#8217;s about making decisions today that will still make sense months or years from now.</p><h2>Why Architecture Comes First</h2><p>It&#8217;s tempting to jump straight into creating screens, APIs, or dashboards. But without a solid backend architecture, every new feature becomes harder to maintain.</p><p>That&#8217;s why I began by designing the core of our system.</p><p>Our backend stack consists of:</p><ul><li><p><strong>NestJS</strong> for a modular and scalable server architecture</p></li><li><p><strong>PostgreSQL</strong> as the relational database</p></li><li><p><strong>Prisma ORM</strong> for type-safe database access and migrations</p></li><li><p><strong>TypeScript</strong> for maintainable and reliable code</p></li><li><p><strong>React + Vite</strong> for the frontend</p></li><li><p>A <strong>shared package architecture</strong> to promote code reuse across applications</p></li></ul><p>This gives us a strong foundation for long-term growth instead of a collection of disconnected features.</p><h2>Designing the Database</h2><p>One of the most rewarding parts of the project has been designing the database.</p><p>Instead of creating tables only for today&#8217;s requirements, I focused on a structure that can support future expansion.</p><p>The initial schema includes:</p><ul><li><p>User management</p></li><li><p>Roles and permissions</p></li><li><p>Customers</p></li><li><p>Bank accounts</p></li><li><p>Transactions</p></li><li><p>Transfers</p></li><li><p>Notifications</p></li><li><p>Audit logs</p></li></ul><p>Although Skyline Computer World is focused on technology retail and services, I&#8217;ve also been exploring banking system design as part of strengthening my backend engineering skills. Building secure financial systems is an excellent way to deepen knowledge of data integrity, transactions, authorization, and scalable architecture.</p><h2>Lessons Along the Way</h2><p>Not everything worked on the first attempt.</p><p>I spent time solving issues involving:</p><ul><li><p>PostgreSQL configuration</p></li><li><p>Prisma migrations</p></li><li><p>Environment variables</p></li><li><p>Gradle and Android tooling</p></li><li><p>Flutter development setup</p></li><li><p>Database synchronization</p></li><li><p>Monorepo project organization</p></li></ul><p>Each obstacle reinforced an important lesson: software engineering is as much about debugging, persistence, and learning as it is about writing code.</p><h2>Leadership Beyond Code</h2><p>Leading a project isn&#8217;t just about contributing code.</p><p>It involves making technical decisions, helping teammates, documenting processes, planning future milestones, and ensuring everyone builds toward the same vision.</p><p>As a 20-year-old computer science student, I know I still have a lot to learn, but every project strengthens my understanding of software architecture, distributed systems, cloud technologies, cybersecurity, and AI integration.</p><h2>What&#8217;s Next?</h2><p>The next phase of development includes:</p><ul><li><p>JWT Authentication</p></li><li><p>Role-Based Access Control (RBAC)</p></li><li><p>RESTful API development</p></li><li><p>Product management</p></li><li><p>Inventory management</p></li><li><p>Order processing</p></li><li><p>Customer dashboard</p></li><li><p>AI-powered features</p></li><li><p>Cloud deployment</p></li></ul><p>Every completed milestone brings Skyline Computer World one step closer to becoming a modern platform for technology products and services.</p><h2>Final Thoughts</h2><p>Software engineering isn&#8217;t about chasing the newest framework or writing the most code.</p><p>It&#8217;s about solving real problems, building systems that last, and continuously improving as an engineer.</p><p>I&#8217;m excited to continue documenting this journey&#8212;not only to share what I&#8217;m building, but also what I&#8217;m learning along the way.</p><p>The best systems are rarely built overnight. They are built one thoughtful decision at a time.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://amjakes.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://amjakes.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Backend API Setup (NestJS + PostgreSQL + Prisma)]]></title><description><![CDATA[Step 1: Create the Backend Folder]]></description><link>https://amjakes.substack.com/p/backend-api-setup-nestjs-postgresql</link><guid isPermaLink="false">https://amjakes.substack.com/p/backend-api-setup-nestjs-postgresql</guid><dc:creator><![CDATA[Jakes Alvin]]></dc:creator><pubDate>Fri, 03 Jul 2026 04:31:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Fehi!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7923271f-d71e-427f-9547-a9e02c1126e6_800x800.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Step 1: Create the Backend Folder</h2><p>From the project root:</p><pre><code></code></pre><pre><code><code>mkdir backend
cd backend</code></code></pre><div><hr></div><h2>Step 2: Install the NestJS CLI</h2><pre><code></code></pre><pre><code><code>npm install -g @nestjs/cli</code></code></pre><p>Verify:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://amjakes.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><pre><code></code></pre><pre><code><code>nest --version</code></code></pre><div><hr></div><h2>Step 3: Create the NestJS Project</h2><p>Inside the backend folder:</p><pre><code></code></pre><pre><code><code>nest new .</code></code></pre><p>Choose:</p><pre><code></code></pre><pre><code><code>npm</code></code></pre><div><hr></div><h2>Step 4: Start the Development Server</h2><pre><code></code></pre><pre><code><code>npm run start:dev</code></code></pre><p>Expected output:</p><pre><code></code></pre><pre><code><code>Nest application successfully started</code></code></pre><p>Test:</p><pre><code></code></pre><pre><code></code></pre><p>http://localhost:3000</p><p>You should see:</p><pre><code></code></pre><pre><code><code>Hello World!</code></code></pre><div><hr></div><h1>PostgreSQL Setup</h1><h2>Step 5: Install PostgreSQL</h2><p>Download and install PostgreSQL.</p><p>Verify installation:</p><pre><code></code></pre><pre><code><code>psql --version</code></code></pre><p>Expected:</p><pre><code></code></pre><pre><code><code>psql (PostgreSQL) 18.x</code></code></pre><div><hr></div><h2>Step 6: Connect to PostgreSQL</h2><pre><code></code></pre><pre><code><code>psql -U postgres</code></code></pre><p>Enter your password.</p><div><hr></div><h2>Step 7: View Existing Databases</h2><pre><code></code></pre><pre><code><code>\l</code></code></pre><div><hr></div><h2>Step 8: Create the Project Database</h2><pre><code></code></pre><pre><code><code>CREATE DATABASE wantam_holdings;</code></code></pre><p>Verify:</p><pre><code></code></pre><pre><code><code>\l</code></code></pre><div><hr></div><h2>Step 9: Connect to the Database</h2><pre><code></code></pre><pre><code><code>\c wantam_holdings</code></code></pre><div><hr></div><h2>Step 10: Check Tables</h2><pre><code></code></pre><pre><code><code>\dt</code></code></pre><p>Initially:</p><pre><code></code></pre><pre><code><code>Did not find any relations.</code></code></pre><div><hr></div><h1>Prisma Setup</h1><h2>Step 11: Install Prisma</h2><p>Inside the backend folder:</p><pre><code></code></pre><pre><code><code>npm install prisma --save-dev</code></code></pre><div><hr></div><h2>Step 12: Install Prisma Client</h2><pre><code></code></pre><pre><code><code>npm install @prisma/client</code></code></pre><div><hr></div><h2>Step 13: Initialize Prisma</h2><pre><code></code></pre><pre><code><code>npx prisma init</code></code></pre><p>This creates:</p><pre><code></code></pre><pre><code><code>prisma/
.env
prisma.config.ts</code></code></pre><div><hr></div><h2>Step 14: Configure the Environment</h2><p>Edit <code>.env</code></p><pre><code></code></pre><pre><code><code>DATABASE_URL="postgresql://postgres:YOUR_PASSWORD@localhost:5432/wantam_holdings"</code></code></pre><p>Replace:</p><ul><li><p><code>YOUR_PASSWORD</code><br></p></li><li><p>database name if different<br></p></li></ul><div><hr></div><h2>Step 15: Configure Prisma</h2><p>Update <code>prisma.config.ts</code></p><pre><code></code></pre><pre><code><code>import "dotenv/config";
import { defineConfig } from "prisma/config";

export default defineConfig({
  schema: "prisma/schema.prisma",
  migrations: {
    path: "prisma/migrations",
  },
  datasource: {
    url: process.env["DATABASE_URL"],
  },
});</code></code></pre><div><hr></div><h2>Step 16: Configure the Schema</h2><p>Replace <code>schema.prisma</code> with your banking models.</p><p>Example sections:</p><pre><code></code></pre><pre><code><code>generator client {
  provider = "prisma-client"
  output   = "../generated/prisma"
}

datasource db {
  provider = "postgresql"
}</code></code></pre><p>Then define:</p><ul><li><p>Enums<br></p></li><li><p>Role<br></p></li><li><p>User<br></p></li><li><p>Customer<br></p></li><li><p>Account<br></p></li><li><p>Transaction<br></p></li><li><p>Transfer<br></p></li><li><p>Notification<br></p></li><li><p>AuditLog<br></p></li></ul><div><hr></div><h2>Step 17: Create the Initial Migration</h2><pre><code></code></pre><pre><code><code>npx prisma migrate dev --name init</code></code></pre><div><hr></div><h2>Step 18: Update the Schema</h2><p>After expanding the banking models:</p><pre><code></code></pre><pre><code><code>npx prisma migrate dev --name add_banking_models</code></code></pre><p>Expected:</p><pre><code></code></pre><pre><code><code>Applying migration...

Your database is now in sync.</code></code></pre><div><hr></div><h2>Step 19: Check Migration Status</h2><pre><code></code></pre><pre><code><code>npx prisma migrate status</code></code></pre><p>Expected:</p><pre><code></code></pre><pre><code><code>Database schema is up to date.</code></code></pre><div><hr></div><h2>Step 20: Verify Tables</h2><p>Connect to PostgreSQL:</p><pre><code></code></pre><pre><code><code>psql -U postgres</code></code></pre><p>Connect:</p><pre><code></code></pre><pre><code><code>\c wantam_holdings</code></code></pre><p>View tables:</p><pre><code></code></pre><pre><code><code>\dt</code></code></pre><p>Expected:</p><pre><code></code></pre><pre><code><code>Account
AuditLog
Customer
Notification
Role
Transaction
Transfer
User
_prisma_migrations</code></code></pre><div><hr></div><h1>Useful Prisma Commands</h1><p>Generate Prisma Client</p><pre><code></code></pre><pre><code><code>npx prisma generate</code></code></pre><p>Reset Database</p><pre><code></code></pre><pre><code><code>npx prisma migrate reset</code></code></pre><p>Create New Migration</p><pre><code></code></pre><pre><code><code>npx prisma migrate dev --name migration_name</code></code></pre><p>Check Migration Status</p><pre><code></code></pre><pre><code><code>npx prisma migrate status</code></code></pre><p>Pull Existing Database</p><pre><code></code></pre><pre><code><code>npx prisma db pull</code></code></pre><p>Push Schema (without migrations)</p><pre><code></code></pre><pre><code><code>npx prisma db push</code></code></pre><p>Open Prisma Studio</p><pre><code></code></pre><pre><code><code>npx prisma studio</code></code></pre><div><hr></div><h1>Useful PostgreSQL Commands</h1><p>Connect</p><pre><code></code></pre><pre><code><code>psql -U postgres</code></code></pre><p>List Databases</p><pre><code></code></pre><pre><code><code>\l</code></code></pre><p>Connect Database</p><pre><code></code></pre><pre><code><code>\c wantam_holdings</code></code></pre><p>Show Tables</p><pre><code></code></pre><pre><code><code>\dt</code></code></pre><p>Describe Table</p><pre><code></code></pre><pre><code><code>\d "User"</code></code></pre><p>Exit</p><pre><code></code></pre><pre><code><code>\q</code></code></pre><div><hr></div><h1>Backend Project Structure</h1><pre><code></code></pre><pre><code><code>backend/
&#9474;
&#9500;&#9472;&#9472; prisma/
&#9474;   &#9500;&#9472;&#9472; migrations/
&#9474;   &#9500;&#9472;&#9472; schema.prisma
&#9474;   &#9492;&#9472;&#9472; prisma.config.ts
&#9474;
&#9500;&#9472;&#9472; src/
&#9474;   &#9500;&#9472;&#9472; app.controller.ts
&#9474;   &#9500;&#9472;&#9472; app.service.ts
&#9474;   &#9500;&#9472;&#9472; app.module.ts
&#9474;   &#9492;&#9472;&#9472; main.ts
&#9474;
&#9500;&#9472;&#9472; generated/
&#9474;   &#9492;&#9472;&#9472; prisma/
&#9474;
&#9500;&#9472;&#9472; .env
&#9500;&#9472;&#9472; package.json
&#9500;&#9472;&#9472; tsconfig.json
&#9492;&#9472;&#9472; nest-cli.json</code></code></pre><div><hr></div><h1>Git Commits Used</h1><p>Initialize backend:</p><pre><code></code></pre><pre><code><code>git commit -m "feat(backend): initialize NestJS backend"</code></code></pre><p>Set up PostgreSQL and Prisma:</p><pre><code></code></pre><pre><code><code>git commit -m "feat(database): configure PostgreSQL and Prisma ORM"</code></code></pre><p>Create banking schema:</p><pre><code></code></pre><pre><code><code>git commit -m "feat(database): implement initial banking database schema"</code></code></pre><p>After migrations:</p><pre><code></code></pre><pre><code><code>git commit -m "feat(backend): set up NestJS backend with Prisma and PostgreSQL"</code></code></pre><div><hr></div><h1>Next Phase</h1><p>With the backend infrastructure complete, the recommended implementation order is:</p><ol><li><p>Create the <strong>Prisma Module</strong> (<code>PrismaModule</code> and <code>PrismaService</code>).<br></p></li><li><p>Implement <strong>Authentication</strong> (JWT + BCrypt).<br></p></li><li><p>Build the <strong>Roles</strong> and <strong>Users</strong> modules.<br></p></li><li><p>Develop the <strong>Customers</strong> module.<br></p></li><li><p>Implement <strong>Accounts</strong>.<br></p></li><li><p>Add <strong>Transactions</strong> and <strong>Transfers</strong>.<br></p></li><li><p>Create <strong>Notifications</strong> and <strong>Audit Logs</strong>.<br></p></li><li><p>Generate <strong>Swagger/OpenAPI</strong> documentation.<br></p></li><li><p>Connect the Flutter frontend to the REST API.</p></li></ol><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://amjakes.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>