e-Portfolio
Table of Contents
Module Reflection
Reflection on the Object-Oriented Programming module.
What?
As a self-taught Full-Stack Software Developer, I was more comfortable with JavaScript/TypeScript and had some experience with Python, but hadn’t fully explored its Object-Oriented features. I have used C++ and C# for game design but found them more challenging due to my limited understanding of Object-Oriented Programming (OOP). This module provided an opportunity to explore the depths of OOP and how it can enhance my software development process.
So What?
Throughout this module, I gained valuable knowledge and hands-on experience with various OOP concepts, UML diagrams, error handling, testing, and design patterns. I realised the importance of the design phase and learned to use different UML diagrams, such as class diagrams (Nugroho & Chaudron, 2009) and activity diagrams, to plan software projects. This experience allowed me to adopt a new mindset for thinking about program components as objects in real life.
The introduction to class diagrams helped me understand their significance as an essential tool in the software development process. However, when it came to designing the UML Diagrams for Assignment 1, it was a bit tricky. I got confused by the difference between Activity and State Machine Diagrams (evidenced by the feedback I received from this assignment), but looking back, I should have taken the time to do more research. My work on debugging and error handling covered different debugging tools and the use of linters like Pylint to improve code quality (Pylint.org, n.d.). I learned that it is essential to identify and fix errors in code and that linters can be helpful in maintaining a consistent coding style. This is not only beneficial to me but also in team settings, where having a standard coding guideline can help everyone write “legible” and clean code.
I delved into exception handling, algorithm design (Smith, 1992), and set operations in Python. This knowledge helped me better understand the importance of efficient coding and data manipulation, which I will apply to future projects. The module also introduced me to unit testing and Test-Driven Development (TDD), which encourages the creation of test cases before writing code to ensure that the code meets the desired functionality (Hamilton, 2023). I realised the importance of code documentation, which allows other developers to understand the code and how it works.
Finally, I was exposed to the concept of design patterns (Design Patterns in Object-Oriented Programming, 2011), which can help strike a balance between theory and practice. As a mostly self-taught developer, I realised the importance of thinking critically and solving problems in programming. This line of thinking was very important when it came to solving Assignment 2, the driverless car. This was quite a difficult assignment, as I didn’t do too well (or as I had expected) in the system design proposal. I had to rethink my approach to implementing the OOP structure for my driverless car programme. A definite saving grace was that we didn’t have to stick to the exact same structure as the proposal, so I was able to make the necessary changes required. I initially started with a basic programme that utilises random data to simulate the sensor inputs (e.g., Object Detection: Pedestrian or Car get returned). After doing some OpenCV tutorials, I decided to try my hand and implement some of its features into my project. I settled on implementing colour detection (Carnes, 2020), which was perfect for my Traffic Signal Detection scenario. By using three images with the colours red, green, and yellow, I can extract them and, depending on the result, the rest of the program responds accordingly.
Now What?
My experience in this module has had a significant impact on my professional and personal development. I will apply the knowledge I’ve gained in OOP, testing, and design patterns to my future projects, making my code more robust, efficient, and maintainable. Additionally, I plan to use UML diagrams and other design tools to ensure that I am adequately planning and designing my applications before diving into implementation.
Furthermore, I intend to explore Test-Driven Development and automated testing to improve the quality of my code and ensure that it meets the desired functionality. In my journey towards game development, I will embrace the challenge of learning C++ and understanding pointers and memory management, which will be crucial for my success in the field.
This module has also shown me the importance of a balance between theoretical understanding and practical application in software development. As I continue my professional growth, I will strive to incorporate both aspects into my work to become a well-rounded developer.
References:
Carnes, B. (2020) Learn How to Use the OpenCV Computer Vision Library. Available from https://www.freecodecamp.org/news/opencv-full-course/
Design patterns in object-oriented programming (2011). January 2011 Edition. MSc-IT Study Material. Computer Science Department, University of Cape Town. https://www.cs.uct.ac.za/mit_notes/software/htmls/ch08s03.html
Hamilton, T.(2023) What is Test Driven Development (TDD)? Example. Available from https://www.guru99.com/test-driven-development.html
Nugroho, A., & Chaudron, M. R. (2009). Evaluating the impact of UML modelling on software quality: An industrial case study. ACM Transactions on Software Engineering and Methodology, 30(1), 1-34.
Pylint.org. (n.d.). Pylint - code analysis for Python. Retrieved from https://www.pylint.org/
Smith, D. (1992). Theory of Algorithm Structure and Design. 19.