Professional Self-Assessment
Nearly twenty years into my career as a software developer, I enrolled in the computer science program at Southern New Hampshire University to complete my degree. As a self-taught programmer exploring options after high school, I was disappointed by the curriculum offered at local universities. After completing undergraduate certificates in microcomputer networking and multimedia technology, I landed a great job that started my professional career. Through a combination of on-the-job training and a personal commitment to continuously improving my skills I created opportunities for myself to advance professionally, but I was interested to know how a current computer science program would compare to the skills I had developed. Now, with the completion of the program at hand, I have broadened my skillset and reinforced the techniques I have been practicing for years.
I was pleased to find that the computer science program at SNHU included classes which focused on the process of creating software in a team environment. In my professional experience I have found that a well-functioning team can produce more than the individual team members could on their own. However, this productivity can only be achieved through effective communication and collaboration. The Object Oriented Analysis and Design course provided a realistic example of how technical designs are communicated to stakeholders throughout a project’s lifecycle. The course reinforced the experience I already had with the unified modeling language and preparing project reports. Likewise, the Software Development Lifecycle course showed how team members might collaborate on a software project, and demonstrated the now common agile approach. Studying the agile methodology from an academic perspective gave me new insights into practices I have used professionally. Additionally, the Collaboration and Team Projects course demonstrated effective use of the git version control system which I have used professionally for many years.
While I had explored fundamental programming concepts in my previous academic career, the programming work I encountered professionally rarely delved into the low-level details. Modern software development environments and reusable software libraries provide advanced functionality to even novice programmers. Indeed, it is rare for even skilled programmers to write code for fundamental data structures and algorithms but knowing how such things are implemented can be critical when choosing which existing components to use in a project. The Data Structures and Algorithms course provided insight into some of the most common data structures used in programming and showed how they might be implemented in C++. This course provided practical experience with structures that I have used for a long time but never implemented directly and clearly illustrated the time complexity inherent in the algorithms used. The Operating Environments course gave a comprehensive overview of the features provided by modern operating systems that tend to be taken for granted by today’s programmers. Exploring how operating systems manage access to system resources for all the software running on the hardware platform demonstrated the value of understanding these mechanisms. This course gave me valuable insight into the platforms I write software for and how to better leverage their capabilities.
Having written software deployed at scale in distributed environments, I have a lot of experience with software engineering in general and the importance of design decisions. A necessary skill for any software engineer is the ability to make appropriate tradeoffs when choosing how to solve a problem. In my experience, there is rarely a single obviously best solution to a given challenge. Having to choose from a few seemingly equal solutions is much more likely. Knowing how to evaluate solutions from several angles is critical to choosing which way to go, and a security perspective is increasingly important to have. The Secure Coding course provided direct examples of common software vulnerabilities and how to correct them. Additionally, the development of a comprehensive security policy throughout the course showed how maintaining a security mindset and taking a holistic approach to attack mitigation are essential habits. The Software Reverse Engineering course gave me the opportunity to gain experience with assembly language, something I had never explored in depth. Every software project I have ever been part of involved interfacing with existing software. Learning how to disassemble and examine the workings of software for which no source code is available gave me another way to evaluate potential solutions.
The projects I have worked on throughout my career have always involved the storage, retrieval, and manipulation of varying amounts of data. In the age of “big data” where storage capabilities are seemingly endless and the techniques for leveraging increasingly large datasets are improving rapidly, database knowledge is essential. Having used many common relational and non-relational databases over the years, I was already familiar with the database concepts explored throughout this program. The Introduction to SQL course gave me the opportunity to revisit some of the earliest database concepts I learned in my career. The Fundamentals of Data Mining course showed various techniques for extracting value from large datasets. The Client/Server Development course provided experience using a non-relational database with a modern browser-based interface for interacting with the dataset.
For my capstone project, I chose to develop a complete solution around the embedded systems programming project developed for my final project in the Emerging Systems Architectures & Technologies course. The final project involved programming a microcontroller development kit to simulate a smart thermostat. This project was a compelling foundation for my capstone project since it demonstrates the ability to write software for Internet of Things platforms which are becoming increasingly popular. It also provided a natural way to layer on additional capabilities by incorporating a server component with a browser-based interface to control the thermostat remotely, and a database component to maintain configurations and store historical temperature data.
The first step to building the complete system was a comprehensive code review of the original code from my CS-350 final project. After identifying several areas for improvement, my first enhancement showcases my software design and engineering skills as a refined version of the original code, with a focus on simplicity, security and reliability. With the enhanced version of the embedded code running on the microcontroller platform, my second enhancement showcases algorithms and data structure usage in the development of the server component and browser-based interface for remotely interacting with the thermostat. Finally, my third enhancement demonstrates my proficiency with databases by collecting time-series data from the thermostat and presenting it graphically in the browser.
This project pulls together many skills that I have learned throughout my career as well as in this program. It demonstrates proficiency in several programming environments from embedded microcontroller devices to common server platforms and web browsers. It also shows my ability to design a cohesive system and implement it using several different programming languages. These skills are valuable in my current job, and I believe they will remain in demand for the foreseeable future.