Engineering Capstone
SFWRENG 4G06A/B
Languages &
Technologies
C++, Node.js, React.js, GitHub
The engineering capstone course is a full-year project course that represents the culmination of the entire undergraduate degree. My team's engineering capstone was Chess Connect, a chess set that tracked piece movement, broadcasting the game in real time to a web application viewable from anywhere. If you're interested in learning about this project in more detail, check out Chess Connect on my project page and my GitHub.
This capstone course had a heavy focus on the software development life cycle (SDLC). Much of the course was focused on writing documentation, such as technical requirements, development plans, architecture & designs, and verification/validation. My group did very well and this was one of my favourite courses to date, though it was a little too focused on the SDLC instead of the product itself.
Concurrent & Parallel Programming
SFWRENG 3BB4
Languages &
Technologies
C, Java, Go, Python
Simply titled "Software Design II", I didn't know what to expect going into this course. It ended up being entirely based around concurrent and parallel system design, with a good mix of both theory and application.
This course covered everything to do with concurrency; Processes, threads, cores, synchronization mechanisms like semaphores, mutexes & messages, resource management & sharing, and architectural design of concurrent systems were all covered in depth. We worked with a different language every month, getting a feel for how concurrent programs work in different languages at high and low levels. We used Java, Python, C/C++, and Go.
Ultimately this was one of my favourite courses at McMaster, and I fell in love with concurrent system design.
Databases
SFWRENG 3DB3
Languages &
Technologies
MySQL, Ubuntu Linux
Databases are an essential concept for any software developer to understand. This course taught me all about databases, specifically about DBMS's, data modeling, integrity constraints, principles & design of relational databases, relational algebra, query processing, transactions & recovery, concurrency control, and security.
Working in MySQL, this course gave me experience applying the theory behind proper database design. If not for the complicated queries I had to write in these assignments, I would not have been prepared for my PL/SQL development experience at Celestica.
Scientific Computation
SFWRENG 4X03
Scientific computation was one of the most challenging courses I took during my time at McMaster. This course went deep into a huge number of complex topics, each more complex than the last; Computer arithmetic, stability & sensativity, numerical methods for polynomial manipulation, interpolation, linear & non-linear regression, integration/differentiation, solving linear & non-linear systems, ODE's & eigenvalue problems were all covered from a mathematical and computational point of view.
The course was focused around how these computational concepts from all over the realm of mathematics could be done quickly, efficiently, safely, and reliably. Memories of spending days doing nothing but mathematical analysis and MatLab scripting will stick with me for a long time, but I really enjoyed the work once I put in the time to understand it. Programming is all about solving complex problems, and these are some of the hardest problems around.
Software Project Management
SFWRENG 3XA3
Languages &
Technologies
React.js, Doxygen, Jira, Mocha.js, Gantt
Software project management was a project-based course that focused much more on the managerial side, emphasizing documentation, planning, scheduling, testing, and maintenance.
The group project had us find an existing open-source project online, and pick a language to refactor it in, as well as adding some features and making small changes. Because we did not have to come up with an idea or create a brand new design/architecture, the main focus was on the surrounding documentation and team management. We wrote a problem statement, development plan, Gantt charts, requirements, user guides, test plans, and test reports. All of these documents were "alive", meaning they were updated as we went, keeping everything in sync.
My group chose an online multiplayer chess game, found here as our base project. We refactored it into Supreme Chess using JavaScript and the React framework, adding additional features like a chat box between players and functioning checkmate termination. If you're interested in learning about this project in more detail, check out Supreme Chess on my project page and my GitHub.
Data Structures & Algorithms (Theoretical)
SFWRENG 2C03
This data structures & algorithms course was my favourite course at McMaster, bar none. My passion lies with automation and finding efficiencies in existing processes. Both data structures and algorithms have this as a main focus - at their core they're designed around being as efficient as possible for some specific use case.
Data structures fascinate me. Different structures, all made to solve different problems, each with its own use case dependent on time and/or memory complexity. Analyzing these structures was the most fun I had during any course at McMaster, even just being from a purely theoretical standpoint.
The algorithms portion of this course was amazing as well. Seeing all the different, unique ways to solve a problem is eye-opening, and seeing how seemingly unrelated or backwards ideas can lead to huge improvements was motivation to think outside the box.
Topics we covered included arrays, linked lists, stacks, queues, hash tables, binary trees, red-black trees, graphs, maps, searching/sorting algorithms, graphing algorithms (minimum spanning trees, traversals, shortest paths), and correctness & performance analysis. Taking this course made me fall in love with computer science, and truly sparked my passion for the subject.
Data Structures & Algorithms (Applied)
SFWRENG 2XB3
Languages &
Technologies
Java, Eclipse
This was a sister course to 2C03, and was entirely focused around applying the theoretical knowledge learned in that course in the form of Java code.
The course had no lectures, consisting only of labs, assignments, and a group project. The labs had us program common data structures, such as stacks, queues, trees, graphs, and hash tables. We also programmed algorithms such as quicksort, mergesort, BFS, DFS, Bellman-Ford, and more.
The group project was based around manipulation of big data. The requirements had us build an application that addressed some real need, utilizing large open-source datasets, and covering specific algorithmic content (searching, sorting, and graphing algorithms).
My group chose to use the Ontario Sunshine List, allowing users to analyze government data in order to find job market data efficiently. Our application, JobViz, takes user input and partitions the dataset, performing searching, sorting, and numeric prediction. If you're interested in learning about this project in more detail, check out JobViz on my project page and my GitHub.
Machine Learning
COMPSCI 4ML3
Languages &
Technologies
Python, NumPy, PyTorch, Colab
Introductory machine learning was a technical elective that I took in my final year, and was one of the most difficult courses I took during my time at McMaster. This course focused on the mathematical theory at the core of different machine learning concepts, performing proofs and analysis on multi-dimensional problems. Topics we covered in depth included regression, interpolation, kernelization, principal component analysis (PCA), probabilistic/Bayesian inference, classification (binary, multi-class, multi-label), and neural networks (NN, CNN, RNN).
This course, though hard, was very interesting to me. Machine learning is one of those concepts that is at the forefront of the public eye, with new mind-boggling technologies being released all the time. Despite that, I never got the chance to work with it until this course, and I loved seeing the inner workings of different machine learning concepts. Neural networks were the most interesting part of this course for me, and it inspired me to start making the Magic Dice Tray project that you can read about in my project page.
Assignments in this course were done in Google Colab, and were a mix between mathematical proofs and programming machine learning models. One had us program different Bayes classifiers, support vector machines (SVM), and perform PCA. Another assignment had us create and compare a regular neural network (NN), convolutional neural network (CNN), and a recurrent neural network (RNN) using PyTorch.
Operating Systems
SFWRENG 3SH3
Languages &
Technologies
C, C++, Ubuntu Linux
Operating systems was a technical elective I took in my third year. The course taught me all about how general-purpose operating systems function, managing resources, control, and priority to the necessary places to keep everything running smoothly. This course covered concurrency in operating systems, including processes, threads, synchronization methods, deadlock and starvation, memory management, and a number of scheduling algorithms to solve these issues.
This course had challenging bi-weekly assignments done in C, covering topics like system interrupts, forking & piping, POSIX multithreading, Unix memory-mapped files, and the Unix file system. These were what made the course engaging for me, as they were fun, difficult, and rewarding when completed. I found operating systems so interesting because of my love for concurrency and for lower level languages. Seeing how things were structured and scheduled gave me a much better understanding of the systems I use on a daily basis.
Dynamic Systems & Control
SFWRENG 3DX4
Languages &
Technologies
MatLab, Simulink, StateFlow
Dynamic systems & control applications taught me about process control for dynamic systems and interaction between process behaviour and controller design. This course covered a lot of mathematical concepts, but focused largely on transfer functions, PID controller design and analysis, open and closed loop systems, and digital control systems.
This 4-unit course consisted of lectures, assignments, labs, a midterm, and a final exam. Assignments and labs were performed using MatLab, Simulink, and StateFlow. Unfortunately this course was offered online due to the pandemic, so the labs did not have the same physical component that they would otherwise would have. However, the PID controller design and analysis remained the same despite not having a physical motor to move.
I found this course interesting, and very much more on the traditional engineering side compared to the software development side. This course (alongside others) taught me how to use Simulink and Stateflow, both of which are powerful and valuable tools. As well, the mathematical modeling, design, and analysis of dynamic systems done in this course was satisfying for me, as I enjoy understanding the bigger picture even when performing complex analysis, and everything here was related and connected to the larger system.