[{"data":1,"prerenderedAt":402},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fleadership-moments":14,"\u002Fblog\u002Fleadership-moments-surround":400},[4],{"title":5,"path":6,"stem":7,"children":8,"page":13},"Blog","\u002Fblog","blog",[9],{"title":10,"path":11,"stem":12},"Leading a Team of Interns From ERD to Deployment: Lessons From PNPKI Tracker","\u002Fblog\u002Fleadership-moments","blog\u002Fleadership-moments",false,{"id":15,"title":10,"author":16,"body":20,"date":391,"description":392,"extension":393,"image":394,"meta":395,"minRead":396,"navigation":397,"path":11,"seo":398,"stem":12,"__hash__":399},"blog\u002Fblog\u002Fleadership-moments.md",{"name":17,"avatar":18},"Lord Cigel Salvar",{"src":19,"alt":17},"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F114234883?v=4",{"type":21,"value":22,"toc":364},"minimark",[23,27,30,35,38,43,46,59,67,71,74,78,81,85,88,100,103,107,114,118,121,125,128,154,160,164,167,173,178,183,186,190,193,197,200,203,230,233,237,240,244,247,265,268,272,282,287,291,294,297,301,304,330,334,337,354,357,361],[24,25,26],"p",{},"A few months ago, I was handed a challenge I hadn't done before — lead three interns from Cor Jesus College through the full development lifecycle of a real, production-bound system. No shortcuts, no hand-holding past what was necessary. From planning the ERD to deploying the app on a live server, we did it together. Today, PNPKI Tracker is up, running, and actively being used.",[24,28,29],{},"This is the story of how we built it — and what I learned about leading a team, teaching Git to people who've never used it, and shipping software as a group for the first time.",[31,32,34],"h2",{"id":33},"starting-with-structure","Starting With Structure",[24,36,37],{},"Before a single line of code was written, I made sure the team understood the problem we were solving. PNPKI Tracker is a Laravel-based tracking system built for the provincial government — specifically designed to monitor the status of PKI certificate applications, from initial submission all the way through to approval. It needed to be reliable, well-structured, and maintainable by people who weren't necessarily going to be around forever.",[39,40,42],"h3",{"id":41},"erd-and-system-design-first","ERD and System Design First",[24,44,45],{},"I gathered the team and we whiteboarded the entire data model together. I didn't just hand them a finished ERD — I walked them through the thinking process:",[47,48,49,53,56],"ul",{},[50,51,52],"li",{},"What are the core entities?",[50,54,55],{},"What are the relationships between them?",[50,57,58],{},"Where do we expect the data to grow?",[24,60,61,62,66],{},"It was slow at first. But making them reason through the design meant they understood ",[63,64,65],"em",{},"why"," the database looked the way it did — not just how to use it.",[39,68,70],{"id":69},"defining-the-scope-together","Defining the Scope Together",[24,72,73],{},"We mapped out the system's modules as a team before assigning tasks. This gave everyone a mental picture of the whole app, even if they'd only be building one part of it. That context matters when you're debugging someone else's code at 10pm.",[31,75,77],{"id":76},"agile-with-interns","Agile With Interns",[24,79,80],{},"I introduced Agile not as a buzzword but as a practical way to avoid chaos. For a small team building a real government system on a deadline, structure is everything.",[39,82,84],{"id":83},"sprints-and-planning-sessions","Sprints and Planning Sessions",[24,86,87],{},"We ran short sprints — typically one to two weeks — with a planning session at the start of each one. I kept it simple:",[89,90,91,94,97],"ol",{},[50,92,93],{},"Review what was done last sprint",[50,95,96],{},"Identify blockers",[50,98,99],{},"Assign tasks for the next sprint based on priority",[24,101,102],{},"The interns adapted quickly. Having a clear sprint goal gave them something concrete to work toward instead of an overwhelming backlog.",[39,104,106],{"id":105},"daily-standups-sort-of","Daily Standups (Sort Of)",[24,108,109,110,113],{},"We didn't do formal daily standups — but I made it a habit to check in with each intern at least once a day. A quick message or a short call: ",[63,111,112],{},"what are you working on, what's blocking you?"," That alone caught a lot of issues before they turned into wasted days.",[31,115,117],{"id":116},"teaching-git-like-it-matters","Teaching Git Like It Matters",[24,119,120],{},"Most interns come in knowing Git exists. Very few know how to use it properly on a real project. This was one of the most important things I taught them — and one of the most rewarding.",[39,122,124],{"id":123},"branching-strategy","Branching Strategy",[24,126,127],{},"I introduced a simple branching model:",[47,129,130,137,143],{},[50,131,132,136],{},[133,134,135],"code",{},"main"," — production-ready code only",[50,138,139,142],{},[133,140,141],{},"develop"," — integration branch for ongoing work",[50,144,145,146,149,150,153],{},"Feature branches — one branch per feature or fix, named clearly (e.g., ",[133,147,148],{},"feature\u002Fapplication-tracker",", ",[133,151,152],{},"fix\u002Fsubmission-status",")",[24,155,156,157,159],{},"No one pushed directly to ",[133,158,135],{},". Ever.",[39,161,163],{"id":162},"pull-requests-and-code-review","Pull Requests and Code Review",[24,165,166],{},"Every feature went through a pull request. I reviewed each one — not just for bugs, but as a teaching tool. Comments on PRs became mini lessons:",[168,169,170],"blockquote",{},[24,171,172],{},"\"Why did you use a raw query here instead of Eloquent?\"",[168,174,175],{},[24,176,177],{},"\"This logic belongs in a service class, not the controller.\"",[168,179,180],{},[24,181,182],{},"\"Good job keeping this method small — that's exactly right.\"",[24,184,185],{},"It slowed things down slightly, but the quality of their code improved sprint over sprint.",[39,187,189],{"id":188},"issues-as-tasks","Issues as Tasks",[24,191,192],{},"We tracked all work through GitHub Issues. Every task, bug, and feature request lived there. It taught them to think in discrete, describable units of work — a skill that will serve them long after this internship.",[31,194,196],{"id":195},"building-with-laravel","Building With Laravel",[24,198,199],{},"Choosing Laravel for this project was a no-brainer. Its built-in tools — Eloquent ORM, migrations, form requests, and blade templating — let the interns focus on learning application logic instead of fighting boilerplate.",[24,201,202],{},"I structured the codebase the way I'd want to inherit it:",[47,204,205,212,218,224],{},[50,206,207,211],{},[208,209,210],"strong",{},"Models"," for every entity, with relationships clearly defined",[50,213,214,217],{},[208,215,216],{},"Form Requests"," for all input validation",[50,219,220,223],{},[208,221,222],{},"Service classes"," for business logic, keeping controllers thin",[50,225,226,229],{},[208,227,228],{},"Migrations"," versioned alongside the codebase so database changes were always tracked",[24,231,232],{},"For interns touching a real codebase for the first time, Laravel's conventions gave them guardrails without being restrictive.",[31,234,236],{"id":235},"from-local-to-live","From Local to Live",[24,238,239],{},"Getting the app running locally is one thing. Shipping it to a real server that real government users depend on is another.",[39,241,243],{"id":242},"server-deployment","Server Deployment",[24,245,246],{},"I handled the initial server setup and walked them through it — explaining each step as I went. We covered:",[47,248,249,252,259,262],{},[50,250,251],{},"SSH access and server navigation",[50,253,254,255,258],{},"Environment configuration (",[133,256,257],{},".env",", secrets management)",[50,260,261],{},"Setting up the web server and database on the VPS",[50,263,264],{},"Running migrations in production (carefully)",[24,266,267],{},"By the end, they understood that deployment isn't magic — it's just a series of deliberate, ordered steps.",[39,269,271],{"id":270},"release-tags-on-git","Release Tags on Git",[24,273,274,275,149,278,281],{},"I introduced Git release tags as a way to mark stable versions of the app. Every time we pushed a production-ready build, we tagged it — ",[133,276,277],{},"v1.0.0",[133,279,280],{},"v1.1.0",", and so on. It gave the team a sense of milestone and made it easy to roll back if something went wrong.",[168,283,284],{},[24,285,286],{},"Tagging releases also made the interns feel the weight of shipping. It's not just a commit — it's a version of the product that real users will depend on.",[31,288,290],{"id":289},"the-moment-it-went-live","The Moment It Went Live",[24,292,293],{},"The day PNPKI Tracker went live was quieter than I expected. No big celebration — just a final deployment, a quick smoke test, and then users started logging in. But for the interns, I could tell it meant something. They built a real system. It was being used by real people inside a provincial government office.",[24,295,296],{},"That's not something you get from a university project.",[31,298,300],{"id":299},"what-i-learned-about-leading","What I Learned About Leading",[24,302,303],{},"Leading interns taught me things about my own craft that I hadn't noticed before.",[47,305,306,312,318,324],{},[50,307,308,311],{},[208,309,310],{},"You don't fully understand something until you teach it."," Explaining Git branching to someone who's never used it forced me to articulate things I had always done on autopilot.",[50,313,314,317],{},[208,315,316],{},"Patience is a technical skill."," Watching someone struggle with a concept you find obvious is hard. But jumping in too fast robs them of the learning.",[50,319,320,323],{},[208,321,322],{},"Code review is culture-setting."," How you review code sets the standard for how the team thinks about quality.",[50,325,326,329],{},[208,327,328],{},"Ownership matters."," The interns cared more about features they designed themselves. Giving them real responsibility — not just ticket work — made a difference.",[31,331,333],{"id":332},"what-the-interns-walked-away-with","What the Interns Walked Away With",[24,335,336],{},"By the time the project wrapped, the three interns from Cor Jesus College had hands-on experience with:",[47,338,339,342,345,348,351],{},[50,340,341],{},"Database design and ERD modeling",[50,343,344],{},"Agile sprint workflows",[50,346,347],{},"Git branching, pull requests, and code review",[50,349,350],{},"Full-stack Laravel development on a real production codebase",[50,352,353],{},"Server deployment and release management",[24,355,356],{},"That's a resume-worthy stack of experience — and I'm genuinely proud of what they shipped.",[31,358,360],{"id":359},"closing-thoughts","Closing Thoughts",[24,362,363],{},"PNPKI Tracker didn't just get built — it got built the right way, by a small team that learned together. If you're ever in a position to lead junior developers or interns, take it seriously. The system you ship matters, but the developers you help grow matter just as much.",{"title":365,"searchDepth":366,"depth":366,"links":367},"",2,[368,373,377,382,383,387,388,389,390],{"id":33,"depth":366,"text":34,"children":369},[370,372],{"id":41,"depth":371,"text":42},3,{"id":69,"depth":371,"text":70},{"id":76,"depth":366,"text":77,"children":374},[375,376],{"id":83,"depth":371,"text":84},{"id":105,"depth":371,"text":106},{"id":116,"depth":366,"text":117,"children":378},[379,380,381],{"id":123,"depth":371,"text":124},{"id":162,"depth":371,"text":163},{"id":188,"depth":371,"text":189},{"id":195,"depth":366,"text":196},{"id":235,"depth":366,"text":236,"children":384},[385,386],{"id":242,"depth":371,"text":243},{"id":270,"depth":371,"text":271},{"id":289,"depth":366,"text":290},{"id":299,"depth":366,"text":300},{"id":332,"depth":366,"text":333},{"id":359,"depth":366,"text":360},"2026-05-01","How I led three interns through the full software development lifecycle — from system design and ERD to a live, running app — and what I learned about teaching, managing, and shipping as a team.","md","https:\u002F\u002Fimages.pexels.com\u002Fphotos\u002F3184418\u002Fpexels-photo-3184418.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",{},8,true,{"title":10,"description":392},"q_Bo72e5ElrvAcrXXvD3FDbuTiYFbjrQUKrq9vdYvvE",[401,401],null,1778905930156]