<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: John Phan</title>
    <description>The latest articles on Forem by John Phan (@johnphan2408).</description>
    <link>https://forem.com/johnphan2408</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3558392%2Fb54dbb5b-1972-4188-a8a9-a6ac3413b390.png</url>
      <title>Forem: John Phan</title>
      <link>https://forem.com/johnphan2408</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/johnphan2408"/>
    <language>en</language>
    <item>
      <title>Group Project 3</title>
      <dc:creator>John Phan</dc:creator>
      <pubDate>Sun, 16 Nov 2025 01:56:17 +0000</pubDate>
      <link>https://forem.com/johnphan2408/group-project-3-3513</link>
      <guid>https://forem.com/johnphan2408/group-project-3-3513</guid>
      <description>&lt;p&gt;For this group project, we worked on improving an existing Java Tetris application by fixing issues and adding new functionality, with each team in the division responsible for a different part of the system. My team was assigned to design the input system so players could choose between using WASD or the Arrow keys to control the game. We first created and submitted a design document outlining how the input options would work and how they would integrate with the current architecture, and once the division leader approved it, we moved on to implementation. Since other team members were quite busy at the time, I took the initiative to implement the core functionality myself, making sure both control schemes worked smoothly and consistently. I also added tests around the main input logic so that when my teammates contribute later, they can verify that their changes don’t break the core behavior. During implementation, I realized that parts of the original design were overengineered, so I simplified the structure to make the code clearer, easier to maintain, and more flexible for future features.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>java</category>
      <category>showdev</category>
      <category>design</category>
    </item>
    <item>
      <title>Project 2</title>
      <dc:creator>John Phan</dc:creator>
      <pubDate>Sun, 02 Nov 2025 04:35:22 +0000</pubDate>
      <link>https://forem.com/johnphan2408/project-2-7c9</link>
      <guid>https://forem.com/johnphan2408/project-2-7c9</guid>
      <description>&lt;p&gt;In our group project we had to play both architect and builder. First, we wrote a design document for another team to implement. That sounded simple until we realized we couldn’t test our ideas, so every class diagram, API, and edge case had to be crystal clear without code to prove it. Then we switched roles and implemented a different group’s design. That was tough in a new way: student-written specs can be incomplete, ambiguous, or optimistic, and we had to fill gaps, reconcile assumptions, and ask lots of clarifying questions. The experience taught us that good design is more than boxes and arrows. It’s concrete examples, clear contracts, traceable requirements, and empathy for the next team. When in doubt: over-communicate, add test cases, and document decisions.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>learning</category>
      <category>design</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Team project 1</title>
      <dc:creator>John Phan</dc:creator>
      <pubDate>Sat, 18 Oct 2025 02:45:33 +0000</pubDate>
      <link>https://forem.com/johnphan2408/team-project-1-6c1</link>
      <guid>https://forem.com/johnphan2408/team-project-1-6c1</guid>
      <description>&lt;p&gt;In this iteration I worked on a Java project built with Gradle, focusing on writing unit tests. The hardest part early on was getting the project to build locally which I had to spend some time to find clear instructions. I then spent time understanding the project structure and reading code base to understand where my new tests should live and which behaviors mattered. Collaboration added another challenge: resolving merge conflicts when merging to main branch. Overall, once setup and structure were clear, progress was steady.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SE371 - Assignment 1</title>
      <dc:creator>John Phan</dc:creator>
      <pubDate>Sat, 11 Oct 2025 02:54:53 +0000</pubDate>
      <link>https://forem.com/johnphan2408/se371-assignment-1-1140</link>
      <guid>https://forem.com/johnphan2408/se371-assignment-1-1140</guid>
      <description>&lt;p&gt;First assignment's task was to set up my Java development environment and write a simple Fibonacci program. The setup process involved installing the JDK, configuring IntelliJ IDEA, and making sure everything worked from the console.&lt;br&gt;
Since I’ve had prior experience working as an intern, the Git setup and IDE configuration steps felt very familiar to me. I’ve used similar workflows before — cloning repositories, committing changes, and pushing to remote branches — so this part was smooth and quick.&lt;br&gt;
The Fibonacci assignment itself was straightforward: write a small Java program that calculates the n-th number in the Fibonacci sequence using simple control structures. I implemented it iteratively and tested a few sample inputs to confirm correctness.&lt;/p&gt;

</description>
      <category>git</category>
      <category>java</category>
      <category>learning</category>
    </item>
    <item>
      <title>SE371 - Assignment 2</title>
      <dc:creator>John Phan</dc:creator>
      <pubDate>Sat, 11 Oct 2025 02:50:44 +0000</pubDate>
      <link>https://forem.com/johnphan2408/se371-assignment-2-42lh</link>
      <guid>https://forem.com/johnphan2408/se371-assignment-2-42lh</guid>
      <description>&lt;p&gt;This week, I focused on refactoring my linked list implementation from a singly linked list to a doubly linked list for my assignment. &lt;br&gt;
Initially, I only had the next pointer to connect nodes in one direction. The goal was to introduce a prev pointer in my SeLinkedList class to make it easier to traverse the list backward and remove nodes efficiently. At first, it seemed simple, but I quickly realized that updating both pointers (next and prev) consistently was trickier than expected. &lt;br&gt;
I ran into several issues where removing or inserting nodes caused broken links or skipped elements. The way I solved it was through persistent debugging, lots of trial and error, and printing out pointer states at every step until everything linked correctly. This experience taught me that in a doubly linked list, every update must happen symmetrically.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>learning</category>
      <category>devjournal</category>
      <category>computerscience</category>
    </item>
  </channel>
</rss>
