Software Engineering Reflection: Debugging Life, One Linter Error at a Time

29 Dec 2024

ICS 314 left its mark as one of the courses that I had put the most amount of effort and time into, and I am happy to say that I’ve reaped its rewards. While it focused mainly on web application development, it gave me a great and in depth understanding of the foundational software engineering principles that go above and beyond just building websites. My two greatest takeaways from this course were functional programming and coding standards. These two concepts are not just central to what we’ve worked on this semester, but are transferable to any kind of software development I involve myself in. For the rest of this essay, I will share what I have learned, and more importantly, how these experiences will serve me better in the future.

Functional Programming

Functional Programming is a method of writing software, where you take on the view where any tasks that need to be done can be broken down into functions, like a math equation. Instead of telling the computer what steps it takes, this method of programming places focus on what exactly needs to be done. This helps to avoid changing variables/data once set, making the code much more straightforward and simple to understand and inevitably debug. In this course, we explored functional programming while working with various languages and environments, specifically TypeScript and Node.js, where methods such as map, filter, and reduce help to handle any kind of data transformation easily.

While it may seem like functional programming is really just one way of doing things, (it is), I found great satisfaction in having completed my program, and the code is so clean and easy to follow. Beyond web development, I could easily see functional programming being super helpful in other areas such as data analysis or even artificial intelligence. Especially having worked with databases such as Postgres, I can see how processing large amounts of data is way easier when you can connect functions like map and reduce.

Overall, this concept has become more like that of a mindset for me, where I now habitually write functions that can stand alone without reliance on others, making my code much more reliable and easy to work with. This goes hand in hand with my next tool, Coding Standards.

Coding Standards

Coding Standards, simply put, are rules for how your code should look and feel. This covers things such as naming variables, formatting code, and writing comments.

In ICS 314, we were particularly exposed to ESLint, which enforced these rules automatically in real coding time. Essentially functioning like a Grammarly extension for VSCode, ESLint was not well received at first (for me at least). I wrote a bit about this in my other essay, “Coding Standards: More Than Just a Style”, but to make it quick, I came to really appreciate the extension. This in addition to functional programming, taught me to think critically about the code I write, and emphasizes the quality and my expectations to be no less than great.

What stood out to me the most about coding standards, are how vital they are when it comes to collaboration. When working with a team, following the same set of standards is quite important, especially to allow for easy understanding of what others are doing/have done. This especially came in clutch for me and my group’s final project. We used ESLint to keep our formatting consistent, and stuck to standard naming conventions. While this may sound simple, I can’t stress how much time was saved when it came to reviewing/combining code. Debugging stress was also kept low since we did not have to waste valuable time trying to figure out what another group member’s code was doing.

This concept, much like functional programming, is not just for web development. Collaboration hinges on communication, but there will always be a lack of it sometimes. A general but followed set of standards allow for our minds to compensate for that, and frankly, learning such standards early on makes me feel prepared to work on even bigger projects with even larger teams in my future.

Conclusion:

ICS 314 has been a wild experience, but the things I have learned about what it means to be a software engineer are invaluable. These skills that are translatable into almost any other field I can think of, are ones that I am very thankful for. I am grateful for this part of my learning journey, and cannot wait to see how far these habits can help me grow as a programmer.