CS-499: Portfolio
open main menu
Career & educational self-assessment
Part of series: journal

Professional Self-Assessment

/ 13 min read
Last updated:

Introduction:

Reflecting on the progress and achievements I have made during my time in the Computer Science program, I am struck by just how much material I have managed to absorb. I have constructed for myself a comprehensive repertoire of skills and knowledge that showcases my strengths within the field of Computer Science. These are skills and abilities that I believe are desirable, and enhance my employability. In this self-assessment, I am going to cover what I feel to be the most significant aspects of my educational growth. The assessment will be separated into three primary categories. I will also be providing an additional assessment at the end of the document that details and summarizes what my capstone project for the program covered, and why it is an important feature of my ePortfolio.

Collaboration in Team Environments:

I have learned many important concepts during my time studying Computer Science. Of these concepts, I believe one of the most valuable outcomes of my education has been building a foundational understanding of how to work and collaborate effectively on a software development team.

We were taught a great deal about how software development firms operate in the various design-centric courses that I completed. My professors were all 20-30 year programming veterans, who spent much of their lives working and operating software development teams. They proved to be an incredibly valuable resource, and I greatly appreciated each piece of feedback that they provided me with.

Some of the topics we covered relating to operations included how both traditional waterfall development, and Agile based development teams operate. We were also later taught the methods used with employers such as Amazon, and how they use a workflow system to incrementally build their software via a continuous integration pipeline. Our studies included how to effectively collaborate when working on a team, whether it be structured for scrum, or for other team formats.

During my time in this program, we were expected to learn the steps that go into formally planning and designing an application, while including input/feedback from stakeholders. Students were expected to learn what duties and work must be accomplished by each role/member of a development team. We not only needed to learn the roles that various team members may perform when on a development team, we also had to practice filling each of those roles.

As teams sizes and roles will differ between organizations, I believe it is incredible valuable to have a strong understanding of the various components that make up a successful development team.

In addition to understanding the various roles, it is equally important for the team to ensure that the final product meets and delivers on the values that are expected by the stakeholders / future users. This includes the importance of regularly asking for and incorporating feedback from stakeholders into our work. Depending on the team format, this can be done via an intermediary team member such as a product owner, project manager, or via direct contact with stakeholder(s). We were expected to prove that we understood and absorbed these concepts by practically applying them to a variety of different design and coding based projects.

Core Computer Science Knowledge:

I’ve gained a wealth of knowledge during my academic studies of Computer Science. Some of the higher level overviews/examples of the materials that we covered in this program are discussed below:

Software Development and Engineering:

  • CS210 - Programming Languages: First course primarily in C++. We learned the importance of generating comprehensive, detailed code documentation.

  • CS320 - Software Testing, Automation, and Quality Assurance: We were taught the importance of testing, and the various formats of tests such as unit, integration, etc. Learned how to build automated testing systems for code bases. Further reinforced our understanding of the importance of providing thorough documentation that follows the best practices for the language and for the organization you are employed for.

  • CS360 - Mobile Architecture & Programming: I learned the steps and process that goes into designing and building a fully functional, mobile Android application. This was done initially using Java, but I ended up teaching myself Kotlin during the semester. I then used both Kotlin and Jetpack Compose to write my final project. This final project was a product management and inventory application. It featured a registration, login/authentication system, and used SMS based alert notifications for set product thresholds when they dipped too low. The application featured a functioning UI, and all relevant features required for an inventory management application.

Data Structures and Algorithms:

  • CS300 - Data Structures and Algorithms: I learned the importance of carefully considering the data structures, and the algorithms that I implement in my work. This included covering a number of different data structures, and the algorithms used to implement them manually. These data structures were coded in C++ and included different binary search trees, singly & doubly linked lists, Hash Tables (with collision management), as well as simpler structures such as vectors. We learned several different types of algorithms, used to perform different types of work such as searching or sorting. We then learned how to calculate and account for the time complexity of our code implementations.

Databases:

  • We covered databases and their applications in several courses, primarily in CS340 - Client Server development, CS465 - Full stack development, DAD220 - Introduction to Structured Query Language, CS360 - Full-stack Mobile Applications, and our capstone course CS499. This included database design, implementation, and how different platforms such as MySQL, MongoDB, or ORM (Object Relational Mapping) based DBMS (Database Management Systems) can be useful to solve varying business needs.

  • In my CS465 - Full-stack Application Design course, I learned how to use handle-bars style templates to build a M.E.A.N. web-application. We also had to learn to build an SPA, or Single Page Application, for administration / management of the M.E.A.N. based web application.

Computer Science theory and Architecture:

  • I took a several theory based courses such as CS230 - Operating Platforms. This re-introduced me to many of the concepts that are core to designing and performing work with computers. These were primarily the academic concepts of computing such as how operating systems are built, how processors perform computations, how memory is used to facilitate work, and how networks function.

Security:

  • Security and writing secure code has been a common theme in my course work. I am very detail oriented, and I am always trying to consider what edge cases need to be accounted for when I am writing code. I would refer to this process as having a security oriented coding mindset. The two courses that offered the greatest contributions towards developing my secure coding mindset, were CS305 - Software Security, and CS410 - Reverse Engineering.

Advanced course Topics:

  • CS410 - Reverse Engineering: I gained a tremendous amount of first-hand experience with low-level programming and assembly instructions. I learned how to disassemble executable applications into hexadecimal and assembly, and then the steps needed to decompile the instructions back into a functioning application within the selected language. This process taught me how stack registers are used to move instructions or data around, and how X86 assembly is used for C++ applications to accomplish work on the platform. I learned how relative memory address calculations are performed in order to determine what instructions should be executed, and in which order. As well as how the stack instruction pointer (%rip) facilitates instructions being passed between registers, and how it calculates the relative location of different data/instructions in memory for each program instruction.

  • CS370 - Current and Emerging Trends: I learned the fundamentals of machine learning, which included how to implement various machine learning algorithms. We learned the math and calculations that are used to build a number of models such as Reinforcement learning, Deep learning neural networks, Deep Q neural networks, Q based algorithms, Monte Carlo Policy Gradient algorithms, and my personal favorite, Actor to Critic based algorithms (A2C). We implemented and tested a variety of neural networks, gradually building in complexity up to our final project. For the final, we were required to create a machine learning algorithm using Python & TensorFlow that could solve a pathing based puzzle game.

These are some of my most noteworthy areas of learning and personal growth in the field of Computer Science. I have learned to apply the concepts that we were taught practically to my programming work through these experiences and projects. The culmination of these practical applications of my knowledge can be seen manifested in the final project that I completed for my CS499 - Computer Science capstone course. This project, as well as earlier work from my education are available for viewing on both my GitHub, and my ePortfolio.

Professional Values, Goals, & Employment:

I feel that my time spent studying Computer Science has solidified my existing work related values. This program greatly helped me shape my current career goals. In the immediate future I would like to work as a software engineer while I am looking into options for graduate schools. I would very much like to spend a few years becoming a better developer in general before I move into an area of high specialization. I have no doubt that I will be an asset to any team that I work on due to my own values regarding my work. I have always had a very strong work ethic, and am highly proficient at independently solving problems. I believe that this is what has allowed me to succeed and quickly rise within the organizations that I have worked at in the past. I greatly enjoy programming, and solving problems through coding. I care deeply about the quality of the work that I deliver, and always put my best efforts into each solution that I work on.

Summarizing and introducing how my artifacts fit together, & how the enhancements inform the portfolio as a whole:

To showcase just how much I have learned over the course of my program, we were asked to select between 1 and 3 artifacts/applications to fulfill the three Computer Science categories. For my own selections, this involved taking an application that I had previously written, planning out a series of enhancements, and then performing those enhancements. The three categories for enhancements were Software Engineering and Design, Data Structures and Algorithms, and Databases. During the planning stage, I selected my CS410 - Reverse Engineering final project as the sole artifact that I would perform my enhancements on. That final project is an internal client management application for a financial investment firm. The initial enhancement planning documents included a full pseudocode breakdown of the planned changes, the full requirements list for each stage of enhancements, and a detailed write up for each stage that could be used with the requirements list to ensure that the desired values are being met with the application enhancements. After the completion of the planning documents, I then performed a recorded code review of the code base that I was using as a starting point for my capstone project. I went through the C++ code covering the functionality of the code, and what would need to be improved on. I then briefly covered how I would like to improve the application through my rewrite in Rust and stages of enhancements for the artifact/program. There were three categories that are important to Computer Science that we were asked to demonstrate our knowledge in with these artifact enhancement stages. The first category was software engineering and design. The second category was data structures and algorithms. And the third category was database design.

As my CS410 - Reverse engineering final project was implemented originally in C++, to fulfill the software engineering and design criteria, I rewrote the application in Rust. This rewrite also focused on meeting relevant industry best, standard coding practices for the Rust language to ensure that the application is stable and secure. I selected Rust as the language for this rewrite, as it is one that I have been self studying for several months, and I have seen that it is a desired language to build an understanding in. I implemented my own error handling system when performing the general application rewrite. This rewrite also included the menu systems, utility & input functions, as well as the data models that would be used to perform work in the application, the Client and Employee structs. I was sure to use proper error handling standards throughout the application, and included input sanitization / validation for my input related menu systems.

To satisfy the data structures and algorithms criteria, I implemented a self-balancing binary search tree to handle local application operations. I also implemented several hash maps to perform caching of requested data objects to limit database queries to only what is needed. I then implemented an authentication system that uses Argon2 to hash employee passwords as they are entered for login attempts. The authentication system validates employee user ids and password hashes by comparing them to the respective associated hash stored within the application’s remote database.

The final stage of the application’s enhancements was to integrate a remote database system into the application. I selected MySQL for this database system as the relational model was the best fit for my application needs. I also wanted to use a database system that supported transactions, and MySQL supports them out of the box. This remote database system would contain two tables, the first being an Employee table, and the second being a Client table. The Employee table is used for the log in and authentication process, it contains an employee’s name, their automatically assigned employee ID number, and the hash of their log in password. The Client table contains an automatically assigned client ID number, the client name, the service that they are receiving from the investment firm, and the ID number of the employee that they are currently assigned to work with.

My professor provided feedback each week to my journal entries, as well as for each section of the project enhancements and planning documentation as they were completed. I integrated the feedback provided by my professor at each stage of the rewrite and enhancements before publishing it to my GitHub pages ePortfolio. The final product is an application that I have dramatically redesigned, improved, and rewritten.

I strongly believe that my work on each of these enhancement components demonstrate a strong rooting and understanding in the core computer science principles that are needed in order to be a successful software engineer. My attention to detail and organization for the various enhancements is provided in detail in the respective project page of my ePortfolio.