Categories
Uncategorized

The Grand Finale

2024 is shaping up to be an unforgettable year for me. It’s the year I’ll be crossing the stage to collect my bachelor’s degree in Computer Science. It’s been a wild ride, but here I am, approaching the finish line with a heart full of hope and a mind eager to explore what’s next.

My journey to this point has been fueled by a deep-seated passion for software development. The pace at Full Sail University is no joke – it’s a fast track that demands quick learning and adaptation. Thankfully, my prior experience gave me a leg up. Having already dipped my toes in the complex world of software development with projects like FieldFab, I’ve navigated through the murky waters of writing, troubleshooting, and debugging problematic code. This hands-on experience was my secret weapon, readying me for the academic challenges ahead.

During my project work, I might have set a new record for the number of pull requests submitted. Whether it was rolling out new features or polishing existing ones, I threw myself into the work with gusto. Before this, my coding adventures were solitary affairs. But diving into a collective project meant wrestling with other people’s code, a challenge that tested and honed my skills. Thanks to my familiarity with various design patterns, I managed to untangle some of the most daunting bugs – feats not typically expected from a student.

January hit a bit of a lull in terms of new tickets, which turned out to be a blessing in disguise. It gave me the chance to double down on what I love most: research. Keeping the saw sharp, so to speak. This dedication to continuous learning and improvement has already paid off in spades, and I’m determined to keep this energy flowing right through graduation and into the next chapters of my life.

Reflecting on this journey that started 20 years ago, I can’t help but feel a mix of awe and anticipation. It’s been a long road, filled with lessons learned and milestones achieved. As I stand on the brink of what feels like a new beginning, I’m excited to see where this path will lead. The future is bright, and I’m ready for it.

Categories
Uncategorized

Week 11: Calm Before the Storm

Hey everyone! Here’s my latest update from the world of programming, where things are a bit quieter this week, thanks to the bustling Black Friday/Christmas season. You know how it is – everyone’s in a whirl, especially at a company that makes fitness machines. The flood of tickets is more like a gentle stream right now, which is a good thing! I’m learning that being a team player in programming isn’t just about fixing all the bugs yourself, but also about collaboration and sharing opportunities. So, I’m resisting the urge to scoop up all the tickets!

A little while back, I tackled a Spotify API token bug and got asked why I revamped the entire authentication process. Well, for those following my Bachelor’s degree capstone project, you might have seen my blog posts on FieldFab and peeked at its code on GitHub. Fun fact: I’ve rewritten FieldFab’s codebase thrice, each version outdoing the last. My journey from the tight-knit, feature-stacking version in 2020 to the sleek, modular FieldFab v3 has been quite an adventure. With iPadOS’s Stage Manager, FieldFab had to adapt to various screen sizes and aspects, so modularity became key. Seeing the Spotify ticket, I got flashbacks of FieldFab v1 – hard to navigate and ripe for a revamp. Hence, I separated authentication from using Spotify’s API, embracing modularity.

This solution was inspired by concurrency, a concept I grasped better after watching a lecture by the creator of the Go language. He differentiated between concurrency and parallelization. It’s like this: imagine Gophers (the Go language mascots) working in assembly-line fashion. They could do tasks sequentially or split the work, each handling a part – that’s concurrency. So, that’s the approach I took with the Spotify issue, and it worked like a charm!

Apart from that, I revisited FieldFab for the first time in months. Post-iOS 17, I found a couple of bugs – a wonky 2D workshop view and some export to PDF glitches. All fixed now, and FieldFab V3.0.7 is up and running on the App Store! I’m also tinkering with my SIMDExtensions library, a wrapper for Apple’s simd framework. It’s all about making simd more Swift-friendly, turning complex C functions into easy-to-use, type-specific extension methods. I’m expanding it to include Integer types – no immediate need for them on my end, but hey, it’s all about creating a comprehensive tool, right?

SIMDExtensions Screenshot
SIMDExtensions Swift package uses a code generator to generate massive amounts of wrapper code

So, while I wait for more tickets to roll in, I’ll be busy with my library. It’s quite the undertaking, but I’m up for the challenge.

Thanks for joining me on this journey, and stay tuned for more updates!

Categories
Uncategorized

Week 10: Strong Foundations

Hey everyone!

Remember last week when I was all abuzz about introducing ViewModel into our project for better dependency injection and unit testing? Well, guess what? This week, I got to see it in action! And, oh boy, it was a blast—even more so because I got to pass the baton to one of my teammates and watch them take it across the finish line with a little coaching from me.

We had this pesky little bug that kept us scratching our heads: whenever you sorted a list of items and selected one, the sort order vanished like a ghost once you navigated back. Turns out, the navigation process was the sneaky culprit, causing our Fragment to vanish into thin air, taking our carefully sorted list with it. But no more!

Our hero, ViewModel, entered the scene. Picture this: I had prepped a ViewModel blueprint in a cosy little branch of its own, and my teammate branched out from there. They grabbed the template and plunged into the challenge. We had our list swooping in asynchronously through the API into a MutableLiveData haven, with the sort preference snug in another MutableLiveData. Then, along came MediatorLiveData, keeping an eye on both, ready to spring into action. It scheduled a computation thread rendezvous, whirled the sorting magic, and voilà—out came the sorted list.

We didn’t just stop at fixing the bug; we made sure it stayed fixed. The ViewModel was summoned from the Activity, and the Fragment—like a loyal companion—retrieved this ViewModel. It watched the sorted list like a hawk and gave the RecyclerView the updates. And since ViewModel pledges allegiance to the Activity’s lifecycle, our sorted list stays bravely sorted through every navigation twist and turn.

But wait, there’s more! I rallied the troops (a.k.a. my team) for a meeting to share the tale of our triumph with ViewModel, ensuring that we’re all ready to wield this newfound power in future tasks. We’ve nailed it this time, and I’m thrilled to see how we can apply it again.

As I march on, I’m diving deep into best practices and devising migration strategies to polish my capstone project to a shine before graduation. The anticipation of what’s to come is sky-high—I can hardly wait to see where we go from here. Thanks a ton for sharing in my journey. Stay tuned!

Categories
Uncategorized

Week 9: Constant Improvements

In the hustle and bustle of the past two weeks, I realized that I inadvertently missed sharing a blog post last week. Nevertheless, I am here now, eager to delve into the myriad of experiences and learnings that have transpired.

Last week was marked by collaborative efforts with my team as we endeavored to complete the remaining features on the search page. My primary task involved integrating my recent search file system utility into the recent search list. During this process, I discovered that my utility was lacking a “delete term at index” method. Once this functionality was added, we successfully connected it to the RecyclerView, which is responsible for displaying recent searches. This marked the completion of the search feature, rendering it fully functional and operational.

Aside from this accomplishment, the remainder of the week was relatively quiet, with no new tickets coming in. I seized this opportunity to further hone my skills in Android development. I challenged myself by rewriting the search page using various design patterns. The initial version of the search page adopted a procedural and imperative approach, resulting in a tightly coupled UI. This complexity in the flow of execution made debugging a challenging task. I dedicated the majority of the week to rewriting the page using ViewModel, MutableLiveData, and RxJava. This approach allowed me to decouple the UI components, leading to significant improvements in both performance and code complexity. Additionally, it shed light on the issues we were experiencing with Jetpack Compose.

In a previous post, I mentioned rewriting the search page with Jetpack Compose, only to encounter performance issues. Upon revisiting this task, I realized that the excessive recompositions on the main thread were the culprit. I reworked the Compose version using ViewModel and Kotlin Flow, resulting in a substantial performance boost. I am now eagerly awaiting feedback from my team on this revised version.

This week brought a new challenge in the form of a Spotify API bug ticket, which I eagerly claimed. I was initially cautioned, as students typically do not handle Spotify bug tickets due to the API’s complexity and its critical role in production builds. Nevertheless, I was granted the opportunity to tackle it. The task proved to be intricate, as Spotify had recently updated their Oauth2 process. This required me to update my Chromium via adb to accommodate the new JavaScript functions used by Spotify. Despite these hurdles, I was able to identify and resolve the issue within a few hours. While I do not have access to the physical device for testing, I am confident in the robustness of my code and look forward to the code review.

As I reflect on the past two weeks, I am filled with a sense of accomplishment and gratitude. I have grown more adept at navigating and understanding extensive codebases, a skill that will undoubtedly serve me well in the future. With graduation on the horizon, I am filled with excitement and anticipation for the next chapter of my journey. I remain committed to continuous learning and am grateful for every opportunity to expand my knowledge and skills.

Categories
Uncategorized

Week 7: Bug Smashing

Hey there! I’m back and absolutely thrilled to share my last two weeks at Echelon Fit. Oops, I overlooked my update last week, so let’s dive into a double update, shall we?

On October 2nd, I got the amazing chance to connect the popular searches API to the search page. A few challenges arose when collaborating with our senior developer, especially when merging our RecyclerView Adapters. We spent quite some time tackling a bug due to merge conflicts, and guess what? It was all because an ArrayList wasn’t initialized properly, leading to a runtime error. It was an eye-opening moment for me; there’s always something new to learn, even with seemingly small issues. Engaging with the senior developer was a real treat. I cherish those moments when I get to discuss code in depth.

By October 4th, I was fully engrossed in the active search suggestions task. Multithreading caught my attention, and I was super excited about it! My task involved creating a scheduled thread pool with a cancellable future. As users type, it debounces the network call by 500 ms. If the input changes within that timeframe, the function re-adjusts, encapsulating the essence of the debounce logic. I managed to generalize this debouncing idea, making it reusable. It felt like a small achievement!

On October 5th, I dove into some design adjustments. While they seemed mainly cosmetic, I noticed a discrepancy in the top navigation bar’s design across the app. Every screen had its unique representation of the top nav bar. I’m keen to ensure everything matches the given designs, so I flagged it for discussion. Awaiting feedback on that!

October 7th was a blend of design tweaks and a deeper dive into a runtime crash issue. While adjusting the workout difficulty sorting was straightforward, the crash was a real puzzle. The issue emerged when selecting and then clearing a filter. The solution? Preventing an unnecessary API call when no filters are active. This issue highlighted some opportunities for code optimization, making me wonder about the potential of Jetpack Compose for the project.

From the 7th onwards, I tackled a couple more bugs. Completing nine tickets in two weeks feels like a milestone, especially considering my college commitments and my full-time job. Excitingly, I took a small initiative to try out Jetpack Compose for the search page. I made sure not to tweak the existing dependencies and created some handy extension functions. I finished this in a day, which made me appreciate the efficiency of Jetpack Compose. I’ve shared this with the senior developer and project manager, and we’re discussing its potential for future use.

All in all, this journey has been exhilarating! I’m constantly learning and growing. If there’s one thing I’ve realized, it’s the importance of presenting oneself effectively. Maybe it’s time to polish my résumé? Onwards and upwards!

Categories
Uncategorized

Week 5: Software Architecture

Week 5 unfolded with a renewed vigor, marking a significant escalation in our endeavors compared to the preceding weeks. We embarked on a new sprint, unveiling a plethora of tickets and ensuring a full workload for the entire team. This week, my focus was on integrating the API suggested search results with the UI using Android’s RecyclerView and accomplishing a ticket that ensures the persistence of recent search results to local storage.

Delving into the recent search results ticket was an exhilarating experience. I had the opportunity to craft a utility class, named RecentSearchesFSUtil, which seamlessly manages the logic for storing, retrieving, and gracefully truncating backfill. It meticulously ensures that each new user search is unique before it’s positioned at the forefront of the list, maintaining a streamlined history. Utilizing a doubly linked list facilitated a more reliable and manageable approach, given the stack/queue nature of the search results. Furthermore, the integration of an observable object within the utility class enabled real-time notifications to observers upon any alterations in the list, allowing for seamless recalculations of each search result on screen. This feature not only ensures separation of concerns but also guarantees file system persistence. The pull request was duly submitted within the week.

However, the journey with the API wiring ticket is still in progress. A discrepancy between the UI and the design surfaced post-integration, necessitating further refinements to align the visual elements accurately. I am retaining this ticket until we achieve alignment between the UI and the design.

This week was a harmonious blend of collaboration and individual contributions, with each member immersed in their respective tickets, many of which are interdependent. The air was abuzz with numerous phone calls and Slack “huddles,” fostering a vibrant atmosphere of collective brainstorming. It’s been an enriching journey, and my anticipation is piqued for the unfolding of the coming week and the feedback from QA on our recent pull requests.

Categories
Uncategorized

Week 4: Starting Development

As I conclude the fourth week of my journey, I find myself reflecting on the myriad of experiences and learnings that have come my way. I opted not to share any updates last week, as the unfolding days were somewhat quiet, with the setup of accounts still in progress, leaving weeks 2 and 3 largely identical—filled with Java exercises and patient waiting.

However, this week marked a significant shift. I was granted access to all necessary accounts and the software repository where I would be contributing. The transition was swift—I received access on Monday and by Tuesday, I had completed two tickets. Interestingly, I was initially assigned only one ticket, but I felt compelled to extend the functionality to respond to user input, adding a layer of interactivity, which, as I later discovered, was another ticket altogether. I was thrilled about the progress and the opportunity to scaffold the project in a way that would facilitate easier integration with the API down the line, utilizing the observer pattern—a functional approach to creating reactive UI using Java/XML.

In this collaborative environment, I’ve uncovered intriguing aspects of professional development within a team. We operate in “sprints,” meticulously planning the next one while working through the current. It’s a structured approach, ensuring that the focus remains on the present tasks before moving on to the next. However, this left me in a bit of a conundrum, as the remaining unassigned tickets were contingent on the completion of others, leaving me momentarily without tasks.

I approach programming with humility, a trait shaped by fourteen years of relentless learning and overcoming challenges. It feels somewhat akin to a star quarterback being side-lined, eager to contribute but respecting the boundaries and responsibilities of each team member. I’m yearning to delve into more coding, but I’m cautious not to overstep by completing tickets assigned to others.

Instead, my focus is on the upcoming tasks, contemplating the potential design patterns my colleagues might employ and strategizing on seamless integration. In the interim, I’m immersing myself in coding exercises and dedicating time to my side projects, ensuring the continual refinement of my skills.

I’m genuinely excited about the future, eager to learn, and looking forward to contributing meaningfully to our collective goals. The journey may be filled with challenges, but it’s the pursuit of knowledge and the joy of collaboration that fuels my passion for programming. I’m committed to embracing every opportunity to learn and grow, and I’m optimistic about what the future holds.

Categories
Uncategorized

Week 2: How Are We Going To Make It?

Hello everyone! I’m thrilled to share some exciting news with you this week. I’ve been accepted into the prestigious Echelon Fit program at Full Sail University, where I’ll have the incredible opportunity to dive into the world of fitness software development tailored to exercise machines. This fantastic opportunity perfectly aligns with my long-standing goals of both hardware and software development, and I can’t wait to embark on this exciting journey!
Echelon Fit on Apple App Store

You know, I’ve come across advertisements for Echelon Fit’s AI-powered resistance weight machine in the past, but I never in my wildest dreams thought I’d get a chance to contribute to a project like this. It’s a true honor and privilege to be a part of this program, and I’m determined to make the most of it.

As I prepare to take on this challenge, I’ve already started gearing up for the work ahead. Since I’ll be working with Android Studio and Java, I’ve taken the initiative to set up my development environment. I’ve got Android Studio up and running on my trusty Mac, updated it to the latest version, and made sure I have the most recent JDK (Java Development Kit) in place. Additionally, I’ve installed various Android SDK targets and downloaded a handful of different emulators to ensure I’m fully equipped for any development scenario.
Android Studio setup for capstone project

While I do have extensive experience with Java Virtual Machine (JVM) languages, including Kotlin and Scala, I want to ensure that I’m at the top of my game for this project. To achieve this, I’m planning to dive into some coding exercises across different JVM languages in the coming weeks. This way, I’ll be fully prepared to tackle the challenges that lie ahead in the Echelon Fit program.

I can’t express how grateful I am for this opportunity, and I’m excited to keep you all updated on my journey as I work towards earning my bachelor’s degree. Stay tuned for more exciting coverage next week! Your support means the world to me.

Categories
Uncategorized

Introduction

Greetings!

My name is Robert Sale. I’m a Computer Science student at Full Sail University, creator of FieldFab for iOS, a father, tech lover, and fun haver! My journey began 18 years ago when I downloaded Garry’s Mod 8.4b and began writing LUA scripts for fun. LUA was a bit challenging for me as I had no prior experience with programming, but I made a few game modes and I even used Garry’s Mod to create presentations for my high school German and English classes (can be found on Youtube if you look hard enough). I became a junior engineer for the US Navy and sailed the deep blue for 5 years. During that time I didn’t do much programming and had forgotten pretty much everything I learned because without an active internet connection out at sea there’s no way to look up code documentation or download new compilers/frameworks. I stopped sailing and became a father soon after. I picked up programming again using Python and Kivy, at which point I made a Linux GUI frontend for NordVPN which up until last year was available on the Ubuntu Snapcraft store. I began working at an HVAC company as a service technician and everyone at the company used Apple products, so in 2020 I decided to buy my first Apple product: the MacBook Air. I loved it so much I now exclusively use Apple computers as my choice to develop software. While doing HVAC I discovered the process of building duct transitions and found that unless you’re a seasoned veteran it is practically impossible to build the perfect transition by hand. I decided I was going to make an iOS app that would help me with the calculations, drawing the cutting lines for the ductwork in a CAD-like fashion, so I could compete with our seasoned fabricators. My app was a huge success! A long time friend from high school saw my app and asked me if I could teach him some of the basics of programming in C# for one of his classes at Full Sail University. Him and his friends were inspired by my story and ability to teach them programming, and they encouraged me to come and get my degree. Thanks to them I mustered up the courage to turn my dream into a reality and apply to Full Sail’s Computer Science Bachelors degree program.

Now that I’m here, 5 months away from graduation, I am working on my final project. It’s been a long journey spanning across many years of uncertainty, but I’m excited to finally be here. Right now I’m an Industrial PLC Programmer for Columbia Fruit, but once I get my degree I’m hoping to get a job that is more geared towards general purpose computer science or computer engineering. I also have some other projects I’m working on that may be an opportunity to start my own company some day.

Thank you for reading! Tune in for another exciting blog post in the near future!