<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Chronicles of a Software Engineer]]></title><description><![CDATA[Chronicles of a Software Engineer]]></description><link>https://ozzadar.com/</link><image><url>https://ozzadar.com/favicon.png</url><title>Chronicles of a Software Engineer</title><link>https://ozzadar.com/</link></image><generator>Ghost 4.48</generator><lastBuildDate>Thu, 01 May 2025 03:09:46 GMT</lastBuildDate><atom:link href="https://ozzadar.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Considerations when Developing for the Cloud]]></title><description><![CDATA[<p>When discussing cloud platforms, cloud computing, and software development for the cloud it&apos;s important to know that, for most development projects, developing for the cloud is the same as developing a traditional multi-tier application. Your applications will still run on a traditional operating system (usually headless Linux) and</p>]]></description><link>https://ozzadar.com/considerations-when-developing-for-the-cloud/</link><guid isPermaLink="false">62622b984ab04900012d680b</guid><dc:creator><![CDATA[Paul Mauviel]]></dc:creator><pubDate>Fri, 22 Apr 2022 04:14:30 GMT</pubDate><content:encoded><![CDATA[<p>When discussing cloud platforms, cloud computing, and software development for the cloud it&apos;s important to know that, for most development projects, developing for the cloud is the same as developing a traditional multi-tier application. Your applications will still run on a traditional operating system (usually headless Linux) and use the same frameworks.</p><p>The differences in development reside mostly in the initial architecting of the product. When considering cloud technologies, it&apos;s important to decide whether you&apos;re looking to develop a traditional monolithic application, a set of microservices, or whether you&apos;ll forgo that entirely and go with a serverless architecture.</p><p>Monolithic applications are what you could consider the &quot;default&quot; architecture. All your services and all your application logic runs through a single, monolithic, application. Monolithic applications are the simplest to conceptualize, maintain, and develop. They do not require shared data contracts or an inter-process communication layer. They will, however, have a larger footprint and require larger hardware requirements as everything is hosted in a single place. This can often lead to higher costs when deploying to the cloud. Additionally, monolithic applications introduce single points of failure that could take entire services offline should errant code be introduced (Kharenko, 2015.)</p><p>Microservices, as the name implies, involve designing your application as a set of pseudo-independent services that share data contracts and often an inter-process communication layer such as RabbitMQ or Kafka. Each individual microservice endeavors to remain small, compact, and quick. Breaking up your services in this fashion allows your infrastructure management software (often Kubernetes) to selectively scale individual portions of your application, leading to an overall reduction in cost and footprint as the application scales to meet growing customer demand (Kharenko, 2015.)</p><p>Serverless architecture is the idea of taking microservices to their extreme logical conclusion. Instead of developing applications, the developers endeavor to encapsulate all functionality into independent autonomous functions that rely completely on the cloud provider&apos;s interface (<em><em>What Is Serverless Architecture?</em></em>, n.d.) The benefit to this is that you would no longer be building a traditional application that needs to be managed, configured, and hosted on the cloud. Hosting, management, and scaling are all handled at the cloud provider level. Some drawbacks to this method include: existing applications must be completely re-written and re-designed to work as serverless, generally an internet connection is required at all times during development, not an intuitive way to build applications leading to longer development times and developer dissatisfaction.</p><p>I slightly touched on the cost of architecting for the cloud. Putting a serverless architecture aside, deploying microservices or a monolithic application in the cloud vs a traditional in-house deployment can save significant costs -- depending on the organization and application.</p><p>A large web application designed to be served to multiple regions would likely save a lot of money going with a pre-built cloud solution such as AWS which already has servers set up in multiple regions. The costs savings being equipment, network engineers, and land.</p><p>However, a smaller application meant to serve a single local development studio or office would save considerable amounts of money long-term investing in a single server and hosting it on-premises. While the upfront cost of the server and a network engineer to set it up would be higher (I&apos;d estimate $5-10000 assuming you&apos;re paying professionals and getting a half-decent server), the ongoing costs plummet to the cost of electricity and, should an internet outage occur, the local office would still have access to its core systems (Hughes, 2018.)</p><p>I believe the question: &quot;Do today&apos;s cloud-based platforms make traditional operating systems obsolete? Why or why not?&quot; is self-evident through my previous responses. No, cloud-based platforms do not make traditional operating systems obsolete because cloud platforms rely on traditional operating systems to serve their content. The question has never been (and likely will never be) &quot;Cloud vs Traditional Operating Systems&quot; -- this implies a fundamental misunderstanding of what the Cloud is. The real question is one of deployment: &quot;Cloud vs On-Prem&quot; or &quot;Cloud vs Self-Hosted&quot; is a lot closer to the core concern we, as engineers, need to concern ourselves with.</p><p>If I were to develop &quot;prototype&quot; code, I would not concern myself with which operating system it&apos;s designed to run on. I&apos;d choose a trivially cross-platform technology that is well-suited to the space and run with it. For web servers, possibly something like Golang for its native binaries and cross-compilation. For graphics applications, I&apos;d either use a cross-platform game engine or a cross-platform graphics API such as Vulkan or OpenGL. I don&apos;t like the question. Answering it directly though, assuming my prototype is meant to be run as a server somewhere, I would ensure it runs on Linux as Linux, and Linux Containers power most of the servers on the internet.</p><p>- Paul<br></p><p><strong><strong>References</strong></strong></p><p><em><em>What is Serverless Architecture?</em></em> (n.d.). Www.twilio.com. <a href="https://www.twilio.com/docs/glossary/what-is-serverless-architecture" rel="noopener">https://www.twilio.com/docs/glossary/what-is-serverless-architecture</a></p><p>Hughes, A. (2018). <em><em>Blog: On Premise vs. Cloud: Key Differences, Benefits and Risks | Cleo</em></em>. Cleo. <a href="https://www.cleo.com/blog/knowledge-base-on-premise-vs-cloud" rel="noopener">https://www.cleo.com/blog/knowledge-base-on-premise-vs-cloud</a></p><p>Kharenko, A. (2015, October 9). <em><em>Monolithic vs. Microservices Architecture</em></em>. Medium; Microservices Practitioner Articles. <a href="https://articles.microservices.com/monolithic-vs-microservices-architecture-5c4848858f59" rel="noopener">https://articles.microservices.com/monolithic-vs-microservices-architecture-5c4848858f59</a></p>]]></content:encoded></item><item><title><![CDATA[Traits of a Good Software Developer]]></title><description><![CDATA[<p>Hello everyone,</p><p>this week I decided to take a closer look at the role of the Development Team in relation to scrum activities due to my having possibly unpopular opinions about the other two roles that would likely color my response in a way that is unproductive to this discussion.</p>]]></description><link>https://ozzadar.com/traits-of-a-good-software-developer/</link><guid isPermaLink="false">622accf74ab04900012d67ff</guid><dc:creator><![CDATA[Paul Mauviel]]></dc:creator><pubDate>Fri, 11 Mar 2022 04:23:57 GMT</pubDate><content:encoded><![CDATA[<p>Hello everyone,</p><p>this week I decided to take a closer look at the role of the Development Team in relation to scrum activities due to my having possibly unpopular opinions about the other two roles that would likely color my response in a way that is unproductive to this discussion.</p><p>As I have more experience as part of a Development Team than any other, I feel that I could share my thoughts on what has made colleagues a pleasure to be on a team with.</p><p>The trait that I found most important to a member of the development team is that of &quot;Criticizes ideas, not people.&quot; Taken one step further, it is important for members of a development team to not take criticisms of their ideas as commentary on their personal abilities (or lack thereof.) Additionally, and I think it is tangentially related, it&apos;s important for developers to take ownership of their failures as well as their successes. Not only does it show maturity and leadership qualities but it also helps foster a cooperative environment of trust and respect (Consulting, 2021.)</p><p>Taking ownership of your mistakes also enables you to learn from them which enables the next important trait of a good member of a development team: &quot;Pursues technical excellence.&quot; Not much needs to be said about the importance of this trait. It is fairly self-evident that having a colleague disinterested in pursuing sound technology will, in the long run, be a detriment to a development team. As they say: &quot;You are only as strong as your weakest link.&quot;</p><p>Finally, I think the last trait I would mark out as being quite important is that of always having fun with each other. As software developers, especially in large corporate settings, your days can get quite repetitive and dull. You&apos;ll likely feel that you&apos;re mostly a cog in a wheel and that every day is like the last. At these times, having a development team you genuinely enjoy working with can make the difference between burnout and a long successful career.</p><p>Anecdotally, I was working at Cisco on some very dry routing software for several years before we transitioned to working from home at the onset of COVID-19. After the initial year, the work itself was fairly dry but the people I worked with at the office were very intelligent, fun to be around, and didn&apos;t take themselves too seriously. After the transition, I found that there was very little communication between ourselves anymore outside of business-centric concerns. It sucked the fun right out of the position and I quickly started to feel burnout. My point is that a fun work environment can make up for a lack of passion for the technology itself.</p><p>I&apos;ve since moved on to work with a team that I can both have fun with remotely, and interests me technologically -- therefore it&apos;s always good to re-assess your enjoyment on a regular basis. Software Engineers are in high demand therefore you can nearly always find a position tangential to your preferred field, or technology. This greatly increases job satisfaction and reduces the chance of burnout. Enjoying what you&apos;re working on also has the added benefit of increasing the quality of your work as you&apos;ll be more engaged and more likely to hit your flow state.</p><p>Thanks for reading,</p><p>Paul</p><p><strong><strong>References</strong></strong></p><p>Overeem, B. (2016). <em>Characteristics of a Great Scrum Team</em>. <a href=" https://scrumorg-website-prod.s3.amazonaws.com/drupal/2016-08/Characteristics%20of%20a%20Great%20Scrum%20Team.pdf">https://scrumorg-website-prod.s3.amazonaws.com/drupal/2016-08/Characteristics%20of%20a%20Great%20Scrum%20Team.pdf</a></p><p>Consulting, M. A. P. (2021, March 11). <em><em>Take Ownership of Your Mistakes</em></em>. MAP | Management Consulting, Executive Coaching, Leadership Development. <a href="https://www.mapconsulting.com/take-ownership-of-your-mistakes/" rel="noopener">https://www.mapconsulting.com/take-ownership-of-your-mistakes/</a></p>]]></content:encoded></item><item><title><![CDATA[Programming Languages: Pick Your Poison (C++ vs Python vs Java)]]></title><description><![CDATA[<p>When choosing a programming language, you&apos;re usually making a determination across several vectors: performance, portability, supporting libraries, and ease of use. Let&apos;s examine our choices across these parameters:</p><h3 id="performance">Performance</h3><h4 id="c-">C++</h4><p>Generally considered, alongside C, to be among the most performant languages. This is somewhat of a</p>]]></description><link>https://ozzadar.com/programming-languages-pick-your-poison-c-vs-python-vs-java/</link><guid isPermaLink="false">6202cf1f4ab04900012d67f7</guid><dc:creator><![CDATA[Paul Mauviel]]></dc:creator><pubDate>Tue, 08 Feb 2022 20:15:03 GMT</pubDate><content:encoded><![CDATA[<p>When choosing a programming language, you&apos;re usually making a determination across several vectors: performance, portability, supporting libraries, and ease of use. Let&apos;s examine our choices across these parameters:</p><h3 id="performance">Performance</h3><h4 id="c-">C++</h4><p>Generally considered, alongside C, to be among the most performant languages. This is somewhat of a misconception. While it is true that C++ has the ability to outperform other languages, this performance does not come <em>by default</em>. Those inexperienced with memory management and good programming practices will often write <em>less performant</em> code in C++ than in a more managed language such as Java or C#. That being said, due to C++ compiling down to native assembly code, it is possible to write code in a way to optimize low-level machine instructions. This ability is not available in the other languages being discussed.</p><h4 id="python">Python</h4><p>The least performant on this list. This is because, and this over-simplified, due to the interpreted nature of Python. When you execute Python code, it is first run through a compiler which converts your code into a Python-specific bytecode that can be run by a Python interpreter, the interpreter then reads this bytecode and converts it once again into machine-specific instructions for the target platform (Dhruvil Karani, 2020.) The compilation step will often cause a delay in initial execution while the interpretation steps come at a somewhat significant (2X-10X slower) performance cost compared to traditionally compile languages.</p><h4 id="java">Java</h4><p>This is the area where Java is, as much as I hate to admit it, mischaracterized. In its infancy, Java suffered from many of the same issues as we just discussed with Python -- with the main difference being that the compilation step is a separate step before execution. Over the years, however, many of those performance issues have been addressed and optimized away. One example of such optimization is in Java&apos;s ability to analyze and optimize application hotspots with the JIT (Just In Time) compiler which will compile frequently accessed Java bytecode as native code throughout runtime to gain native performance in key areas as the application runs (Oaks, 2014.) This is the basis for many people claiming that the JVM needs to &quot;warm up&quot; before being able to properly measure its performance.</p><h3 id="portability">Portability</h3><h4 id="c--1">C++</h4><p>C++ falls high on portability. There&apos;s a C++ compiler for pretty much every platform (<em>List of compilers</em>, 2020.) C++ code, however, is not portable <em>by default. </em>Most standard libraries are supported on most compilers -- however specific support can and does vary based on CPU architecture and platform. Additionally, the C++ spec does not provide any cross-platform GUI libraries. One advantage to going with C++ is that for any platform you support, you get native binaries that require no additional software on the system.</p><h4 id="python-1">Python</h4><p>Python, being an interpreted language, is highly portable in that the same Python code should have identical output on any platform it runs on. The caveat to this, however, is that it requires a Python interpreter to be available on the machine. Additionally (and anecdotally), some of the supporting tools (pip specifically in this example) will not immediately be compatible with every platform. For example, the <em>numpy </em>package and packages that rely on it are not (as of a couple of months ago), installable on the new Mac M1 machines using <em>pip. </em>While not an issue with Python specifically, this example shows a weakness in its portability. Another disadvantage to Python is that it is much more difficult to get any distributable binaries that don&apos;t require a Python interpreter to be pre-installed on the system. I suspect many binaries that would run Python in the background have a thin C++ layer such as we created in this class to distribute.</p><h4 id="java-1">Java</h4><p>Java is generally considered the gold standard in terms of portability due to its Java Virtual Machine (JVM). All Java code and libraries are guaranteed to be portable to every platform on which a JVM can be found (Hartman, 2021.) Due to this guarantee, the language&apos;s adoption, and the large amounts of money poured into the Java project, a JVM is available for pretty much every platform. Java code is compiled down into <em>Java Byte Code</em>, which requires a JVM on the target machine to run. The benefit is that the same Java Byte Code can be run, without changes, on any JVM.</p><h3 id="supporting-libraries-and-ease-of-use">Supporting Libraries and Ease of Use</h3><h4 id="c--2">C++</h4><p>The ease of use of a language is closely tied to its supporting libraries and the ease with which they&apos;re used. To begin, C++ is a language that has a decently steep learning curve. While easier to get a Hello World application than Java, it takes considerably more effort to accomplish anything &quot;substantial&quot; than more managed languages such as the other ones on this list. Memory management needs to be handled explicitly and consciously. In addition to this, integrating outside libraries is more complicated due to the low-level nature of the language. The build process often requires the importing of multiple libraries, compiling and configuration using a tool such as CMake, and a plethora of other concerns you don&apos;t need to deal with in many other languages. Package management is also not defined in the standard either (though this pain point will be less painful with the introduction and support of modules in C++20.) C++ also integrates pretty seamlessly with the wealth of C libraries available which gives it access to a very long history of software development.</p><h4 id="python-2">Python</h4><p>Often considered the easiest language to work in. Not only for its more language-natural syntax but also for its robust, built-in, feature set and ecosystem of supporting libraries. Used often as a scripting language to perform quick and simple tasks, it is often combined with native libraries to offset the performance cost of the interpreter. Memory is managed and package management is, essentially, part of the Python standard.</p><h4 id="java-2">Java</h4><p>A middle ground between C++ and Python. Many people find Java to be more difficult to get started with due to its large amount of boilerplate to get a simple Hello World application. While the syntax is very C-like, building substantial applications comes with less cognitive overhead considering memory management is handled for you and there are fairly strict guidelines on what is and is not allowed. Package management can be painful as well however Maven is fairly simple to use and has emerged as the defacto standard -- making it relatively easy to figure out due to the number of resources available.</p><hr><p>All that being said, I have naturally tended towards using C++ in most of my applications as I am I work on game engines for a living, specifically using the OpenGL, Metal, and Vulkan APIs. These APIs (other than Metal), are provided as C libraries or have a thin C++ abstraction on top of a C library.</p><p>Game engines, and games in general, use more memory than most standard applications both on the GPU and CPU. They also have fairly strict performance requirements. Players generally expect games to run at a constant 60 frames per second, or as high as 120 frames per second for a smooth virtual reality experience. This requires carefully managing when data is loaded or unloaded into memory and also requires that the underlying machine code is doing as little as possible. Manual memory management is not possible in most languages and any language with an interpretation layer will not allow you to micromanage specific assembly calls (this is likely an untrue blanket statement but holds as a general rule.)</p><p>For the actual gameplay systems implementation, many engines will use a higher-level language such as C# (unity), blueprints (Unreal), GDScript (Godot), or Lua (Roblox and World of Warcraft) and provide a simple interface to the underlying optimized code. If you asked yourself what the point of embedding Python into your application it&apos;s largely for these kinds of setups. A setup wherein you provide a simplified, safe API in a higher-level language for interacting with your system while hiding away all the complicated pieces that can break if used wrong.</p><hr><p>Programming languages are a fun topic that a lot of people get really passionate about, sometimes in non-productive ways. The key is to understand that every language was created for a purpose and most, looking at you Brainf*ck (<em>Brainfuck</em>, 2021), have use-cases where an argument can be made to be chosen.<br><br>Thank you for coming to my TED talk,<br>Paul<br><br><strong>References</strong></p><p><em>List of compilers</em>. (2020, January 9). Wikipedia. <a href="https://en.wikipedia.org/wiki/List_of_compilers" rel="noopener">https://en.wikipedia.org/wiki/List_of_compilers</a></p><p>Hartman, J. (2021, December 11). <em>Java Virtual Machine (JVM) &amp; its Architecture</em>. Www.guru99.com. <a href="https://www.guru99.com/java-virtual-machine-jvm.html" rel="noopener">https://www.guru99.com/java-virtual-machine-jvm.html</a></p><p>Oaks, S. (2014). <em>4. Working with the JIT Compiler - Java Performance: The Definitive Guide [Book]</em>. Www.oreilly.com. <a href="https://www.oreilly.com/library/view/java-performance-the/9781449363512/ch04.html" rel="noopener">https://www.oreilly.com/library/view/java-performance-the/9781449363512/ch04.html</a></p><p>Dhruvil Karani. (2020, January 9). <em>How does Python work?</em> Medium; Towards Data Science. <a href="https://towardsdatascience.com/how-does-python-work-6f21fd197888" rel="noopener">https://towardsdatascience.com/how-does-python-work-6f21fd197888</a></p><p><em>Brainfuck</em>. (2021, October 5). Wikipedia. <a href="https://en.wikipedia.org/wiki/Brainfuck" rel="noopener">https://en.wikipedia.org/wiki/Brainfuck</a></p>]]></content:encoded></item><item><title><![CDATA[Getting your foot in the door as a Software Engineer]]></title><description><![CDATA[<p>The &quot;how to get your foot in the door&quot; question is always tricky. Personally, I have found the most success leaning on the power of recruiters and head hunters. This is especially true if you have a less conventional background (no degree) or little experience.</p><p>The reason for</p>]]></description><link>https://ozzadar.com/getting-your-foot-in-the-door-as-a-software-engineer/</link><guid isPermaLink="false">61d5f37b4ab04900012d67ec</guid><dc:creator><![CDATA[Paul Mauviel]]></dc:creator><pubDate>Wed, 05 Jan 2022 19:37:49 GMT</pubDate><content:encoded><![CDATA[<p>The &quot;how to get your foot in the door&quot; question is always tricky. Personally, I have found the most success leaning on the power of recruiters and head hunters. This is especially true if you have a less conventional background (no degree) or little experience.</p><p>The reason for this is because HR application systems these days nearly universally have some parser binning a large portion of resumes and applications long before a human ever sees them. Don&apos;t have a degree? Binned. Missing a keyword? Binned.</p><p>Recruiters will often have direct connections with the hiring managers in their area and be able to &quot;put a good word in&quot; for you. I&apos;ve seen a few people get good results focusing on their LinkedIn profile, reaching out to as many recruiters as possible. Scheduling phone calls or face-to-face conversations is 1000x better than instant messaging.</p><p>That being said, you need to impress. Therefore, you should have a strong portfolio or demonstrated experience. You should have a fairly full github profile, with good activity stats. This is what my chart looks like while working a fulltime job and attending university:</p><figure class="kg-card kg-image-card"><img src="https://learn.snhu.edu/d2l/le/961975/discussions/posts/60919777/ViewAttachment?fileId=57342446" class="kg-image" alt loading="lazy"></figure><p>If your focus is to find a job, and you&apos;re not working, it should likely be a lot more filled up.</p><p>As for what you should put in your portfolio, I want to say it barely matters with one caveat: it needs to be somewhat original, not following a tutorial. There are trends hiring managers see with portfolios that make a lot of candidates look the same. For a long time, TODO apps were <strong><strong><em><em><strong>the</strong></em></em></strong></strong> fullstack application to put on your resume. I think some youtube videos told people this so like 4/5 new developers had it as their showcase piece. For the last couple of years, COVID tracker apps have dominated. A lot of people have started shifting to that.</p><p>Myself, I&apos;ve had a variety of things I worked on over the years. I built a mario maker clone in a game engine which included a rest api for user management and level storage. I built a fairly substantial container management system that balanaced containers across multiple docker endpoints hosted across different systems. Some C++ client/server applications. I also have a main YouTube channel where I&apos;ve been on-and-off posting tutorials for the more tricky things I&apos;ve learned over the years. Whenever I feel that there wasn&apos;t a good lesson available and I had to struggle for a few hours, I organize the work and condense the knowledge as succinctly as possible. This is good for your portfolio <em><em>and</em></em> helps you retain everything.</p><p>In the end, find something <em><em><strong><strong>meaty</strong></strong></em></em> that you find interesting and try to build it. Stick it on GitHub and look for the next thing. This will set you up to be able to &quot;unstick&quot; yourself, give you a grasp on some of the larger software engineering concerns around architecture and generally <em><em>make you less annoying to senior engineers.</em></em> This may sound harsh, but this is some of the justification for paying junior engineers so much less. They take up a lot more of a senior engineer&apos;s time.</p><p>Building on that, the final piece of advice I give everyone: never accept a junior/ internship role. It&apos;s more beneficial for you to spend 6 months building an impressive portfolio and getting a full position than settling for a junior role at (usually) a massive pay cut with the same professional responsibilities. Your first role in the industry plays a large role in your career&apos;s short and longterm trajectory (Don, 2012.) The salary difference between a &quot;junior software engineer&quot; and &quot;software engineer&quot; is usually substantial. Think 50-60k/yr to someone else&apos;s 85-100k/yr.</p><p>Hope this is useful, sorry for the wall of text. I always have lots to say.<br><br><strong><strong>References</strong></strong></p><p>Don. (2012, September 26). <em><em>How Your Starting Salary Affects Your Career Earnings</em></em>. 20s Finances. <a href="https://www.20sfinances.com/how-your-starting-salary-affects-your-career-earnings/" rel="noopener">https://www.20sfinances.com/how-your-starting-salary-affects-your-career-earnings/</a></p>]]></content:encoded></item><item><title><![CDATA[Inheritance in the Wild]]></title><description><![CDATA[<p><em>Note: This is a verbatim copy of a discussion post I made for IT-145 at SNHU. I liked it so I&apos;m putting it here.</em></p><p>	The first principle, inheritance, describes one&#x2019;s ability to describe data objects in a way that can be extended to create new types</p>]]></description><link>https://ozzadar.com/object-oriented/</link><guid isPermaLink="false">618dbf724ab04900012d67d0</guid><dc:creator><![CDATA[Paul Mauviel]]></dc:creator><pubDate>Fri, 12 Nov 2021 01:15:04 GMT</pubDate><content:encoded><![CDATA[<p><em>Note: This is a verbatim copy of a discussion post I made for IT-145 at SNHU. I liked it so I&apos;m putting it here.</em></p><p>	The first principle, inheritance, describes one&#x2019;s ability to describe data objects in a way that can be extended to create new types while reducing repeated code. This plays well with another programming principle: the DRY principle which states, in its most simple and reduced form: Don&#x2019;t Repeat Yourself (Don&#x2019;t Repeat Yourself, n.d.) One of the key advantages to inheritance is that you can hold a collection of objects referenced by their parent classes. There are pitfalls in relying too heavily on inheritance. Heavily subclassed codebases are more difficult to understand, read, and most importantly, unit test. The trick is to inherit the right classes. There&#x2019;s a simple way of getting a general idea if inheritance may be the right call. Does the proposed subclass describe an &#x201C;is a&#x201D; or a &#x201C;has a&#x201D; relationship? Let&#x2019;s use an Animal class. A cat &#x201C;is an&#x201D; animal; therefore, inheritance likely makes sense to describe their relationship. However, if the relationship can be described as &#x201C;has a&#x201D; (a cat &#x201C;has a&#x201D; tail), then it&#x2019;s better to describe the relationship through composition (Nero, 2020.)</p><p>	The second principle, encapsulation, describes grouping like items together as a logical whole and limiting access to the internals in order to create atomic objects that aren&#x2019;t affected by, and do not affect, outside classes. This is seen most commonly by class member variables and are often what is being stored when discussing the aforementioned method of composition.</p><p>	The third principle, abstraction, is the idea of distilling the essence of an object to its most core component pieces and providing an interface for interacting with those pieces. At the most basic level, it can be described as the verbs that can be performed on, or by, an object. Going back to our Cat example, a cat&#x2019;s abstraction not only includes its properties (color, size, etc) but also the things it can do (Walk, Run, Meow, Purr, Eat, Hunt) and the things that can be done to it (Pet, Feed, Pick Up).</p><p>	Finally, the last principle of polymorphism is the idea that classes related by inheritance can implement the same interface with different implementations. Let&#x2019;s assume we have a Feline parent class with a defined function of Eat. This Eat function can be implemented differently on the Cat class (eats 10lbs of food per day) than on the Tiger class (eats 100lbs of food per day.) This principle is the main enabler to the example of sharing the same container. In a simulation, you can have an array of Felines which, once per iteration, calls its Eat function. This would allow different amounts of food to leave the simulation&#x2019;s ecosystem based on the type of Feline without having to write duplicate code for each breed.</p><p>	The most interesting thing that I&#x2019;ve played with so far in this course is the idea of generics. In the final project, I used generics to create search functions for the various animal types in order to follow the DRY principle. I had used them in the past but had never had a need for creating my own in Java.</p><p>Until next time,</p><p>Paul</p><p><strong><strong><strong>References</strong></strong></strong></p><p>Don&#x2019;t Repeat Yourself. (n.d.). DevIQ. <a href="https://deviq.com/principles/dont-repeat-yourself" rel="noopener">https://deviq.com/principles/dont-repeat-yourself</a></p><p>Nero, R. D. (2020, January 8). Inheritance versus composition: How to choose. InfoWorld. <a href="https://www.infoworld.com/article/3409071/java-challenger-7-debugging-java-inheritance.html" rel="noopener">https://www.infoworld.com/article/3409071/java-challenger-7-debugging-java-inheritance.html</a></p>]]></content:encoded></item><item><title><![CDATA[My journey with C++20 (with tutorials)]]></title><description><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/bvjeF3DtsNc?list=PLKH0QdYnI6AlcsMeNTN0G8QRKum4p7QbT" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><p>If you&apos;ve been keeping up with my work (mostly on YouTube), then you have probably seen the noticeable shift in focus I&apos;ve made recently to content surround C++. This is the inevitable result of my deepseeded interest in Virtual Reality and writing my own stuff.<br><br>As</p>]]></description><link>https://ozzadar.com/my-journey-with-c-20/</link><guid isPermaLink="false">60c785d24ab04900012d674c</guid><category><![CDATA[c++]]></category><category><![CDATA[game engine]]></category><category><![CDATA[game dev]]></category><dc:creator><![CDATA[Paul Mauviel]]></dc:creator><pubDate>Mon, 14 Jun 2021 17:02:08 GMT</pubDate><media:content url="https://ozzadar.com/content/images/2021/06/maxresdefault.jpeg" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/bvjeF3DtsNc?list=PLKH0QdYnI6AlcsMeNTN0G8QRKum4p7QbT" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><img src="https://ozzadar.com/content/images/2021/06/maxresdefault.jpeg" alt="My journey with C++20 (with tutorials)"><p>If you&apos;ve been keeping up with my work (mostly on YouTube), then you have probably seen the noticeable shift in focus I&apos;ve made recently to content surround C++. This is the inevitable result of my deepseeded interest in Virtual Reality and writing my own stuff.<br><br>As you may know, for the last year I&apos;ve been working inside the Godot game engine creating a Mario Maker Clone (http://platformer.ozzadar.com). However, at the end of 2021 I finally bit the bullet and bought my Valve Index.</p><p>Shortly thereafter I attempted to start creating content, using Godot, for PC VR. The very first thing I tried however had me running headfirst into limitations of the (current) Godot renderer and its associated VR plugin. I made attempts at rectifying some of the issues myself, but quickly realized that I have a severe lack of experience with low level graphics APIs (I was attempting to extend the VR plugin to support the Vulkan renderer on Godot&apos;s 4.0 branch).<br><br>That being the case, I resolved myself to rectifying the situation. I quickly started learning game engine development and the Vulkan API. These technologies are, generally speaking, written using C or C++. </p><p>I chose C++ because I don&apos;t like pain. I quickly jumped in with my outdated rudimentary C++ knowledge.</p><p>____</p><p>Now, game engines are complicated. Good game engines have some pretty neat features which, to this day, I&apos;m still unsure how I&apos;m going to implement when I get there. I do know, however, that if I had a more complete grasp on the C++ language I would probably be able to figure alot of these things out myself.</p><p>Upon embarking on my journey of C++ mastery, I resolved to ensure that I was learning good, modern habits. Specifically, I wanted to get ahead of the curve and adopt a mostly C++20 approach. The problem? Learning resources for C++20 (and C++17 for that matter) are relatively scarce or esoteric and high minded (looking at you CPPcon!).<br><br>I did, however, run into a lecture by Marc Gregoire where he promoted his book <a href="https://amzn.to/3wnVL5p">Professional C++</a>. In this book, he claimed, was not only descriptions of C++20 standards &#x2013; but also demonstrations of anti-patterns and explanations of what to discard from previous C++ standards. I picked up the book and to my delight he was not exaggerating.</p><p>Anyways, I decided that as I worked my way through it I would create lessons for those interested in learning who may not be able to acquire the book themselves or for those who don&apos;t learn effectively through textbooks. I do my best to give enough detail to be practical while leaving alot of value within the book itself.<br><br>I highly suggest that anyone interested in C++, specifically the newer standards, to pick up this excellent reference. Here&apos;s another link incase you missed it above:<br><a href="https://amzn.to/3wnVL5p">Professional C++</a>.<br><br>I have some stuff in the works I hope to show off soon.<br><br>Until next time,<br>- Ozzadar</p>]]></content:encoded></item><item><title><![CDATA[Development Updates]]></title><description><![CDATA[<p>Hey guys, it&apos;s been awhile since I&apos;ve update (or even visited) my website &#x2013; though I&apos;ve been doing a lot over on Github and more than ever over on YouTube. </p><p>Upon trying to put out an update, I noticed this site was down. How</p>]]></description><link>https://ozzadar.com/development-updates/</link><guid isPermaLink="false">60b4839e4ab04900012d66af</guid><dc:creator><![CDATA[Paul Mauviel]]></dc:creator><pubDate>Mon, 31 May 2021 07:04:25 GMT</pubDate><media:content url="https://ozzadar.com/content/images/2021/05/plans.png" medium="image"/><content:encoded><![CDATA[<img src="https://ozzadar.com/content/images/2021/05/plans.png" alt="Development Updates"><p>Hey guys, it&apos;s been awhile since I&apos;ve update (or even visited) my website &#x2013; though I&apos;ve been doing a lot over on Github and more than ever over on YouTube. </p><p>Upon trying to put out an update, I noticed this site was down. How odd. Apparently the docker container that&apos;s running it died. I forgot to check the logs before I restarted it though &#x2013; so I guess I won&apos;t know what happened until it happens again... That being said &#x2013; it&apos;s likely not to be down for long stretches again. Turns out I forgot to stick a restart policy on the container. This has been rectified.</p><p>Anyways, development updates!<br><br>So it&apos;s been quite awhile since I released the Open Source Mario Maker Clone to the world &#x2013; and to my delight, there has been one level uploaded to the server since then! </p><h2 id="the-2021-education-expedition">The 2021 Education Expedition</h2><p>Since then, I&apos;ve been upgrading / sidegrading my development skills into a more low-level direction. <br><br>So how&apos;s that been going? Slowly. That&apos;s how. There have been multiple barriers that I&apos;ve been working my way through for months now. While sometimes it feels like I&apos;m making very little progress &#x2013; whenever I reflect on things I know now that I didn&apos;t 6 months ago; I realize that I&apos;ve come a mighty long way.</p><p>Let&apos;s get specific. I&apos;ve been studying multiple subjects:</p><ol><li>C++ &#x2013; While I wouldn&apos;t call myself BAD at C++; it had never been my primary language of development. It&apos;s just not in super high demand. Other languages pay the bills much more effectively. That being said, I purchased 2 books that I&apos;ve been working my way through. <br><br>- Professional C++ by Marc Gregoire <a href="https://amzn.to/3yPooKe">https://amzn.to/3yPooKe</a><br>- Concurrency in Action by Anthony Williams <a href="https://amzn.to/3wLSyfO">https://amzn.to/3wLSyfO</a><br><br>I&apos;m working through these specifically to gain insights on some of the newer, less documented C++ standards. Specifically, I&apos;m trying to work as closely to C++20 as I can.</li><li>Game Engine Architecture &#x2013; Virtual Reality requires efficient runtimes. Efficient runtimes are basically what game engines do; therefore I&apos;m studying game engines. I&apos;ve been working my way through this book:<br><br>- Game Engine Architecture by Jason Gregory <a href="https://amzn.to/3yP6A1Z">https://amzn.to/3yP6A1Z </a></li><li>Vulkan and Graphics Programming &#x2013; my mathematics skills need work. Additionally, I know very little about the technicals behind graphics programming. Therefore, this is where I&apos;ve been spending the bulk of the last few months. On top of the book that I&apos;ve been working through: <br><br>- Real Time Rendering by Tomas Akenine-M&#xF6;ller <a href="https://amzn.to/3c5tJ6p">https://amzn.to/3c5tJ6p</a><br><br>I&apos;ve also gone through a Udemy course on Vulkan, Vulkan tutorials on <a href="https://vkguide.dev">https://vkguide.dev</a> and <a href="https://vulkan-tutorial.com/">https://vulkan-tutorial.com/</a>. With some of the Vulkan specifics out of the way, I&apos;m also getting started with some UC San Diego Graphics Programming courses online.</li></ol><p>So this is everything I&apos;ve been shoving into my brain over the last few months. This is not everything I&apos;ve been upto though. I&apos;ve also been trying to put these learnings to use with...</p><h2 id="2021-personal-projects-">2021 Personal Projects!</h2><p>A year can&apos;t go by without setting myself some things I want to make; here&apos;s what I&apos;ve been upto so far:</p><p>YouTube &#x2013; I find that the best way to solidify my learning outcomes is to produce learning materials for others to consume. The first few months had been slow as I was putting all my time and energy into my knowledge acquisition but I was challenged to a race to monetization &#x2013; so I&apos;ve ramped up to trying to keep a weekly upload schedule. Instead of rehashing one of my videos, here&apos;s the plan for YouTube:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/OjtQsSM7WEo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><p>Virtual Reality Engine &#x2013; I decided I was going to build my own VR Rendering / Game Engine thing from scratch using C++, Vulkan and OpenVR. It probably goes without saying, but I had decided to build this BEFORE I had decided to embark on my ridiculous learning adventure. This has been slow going &#x2013; as rendering is hard AF if you&apos;ve never paid attention to it before.</p><p>However, I&apos;ve got a renderer and I&apos;m on the cusp of outputting the image to my Valve Index. Once that is accomplished, I expect progress will be a lot more consistent as... to be honest I&apos;ve kind of been procrastinating on putting the hours in to figure out multi-target rendering and outputting the left/right eye image.</p><p>_______________________</p><p>Anyways, that&apos;s everything going on in development land from my end. I&apos;ll try to empty my brain onto this page more often. It&apos;ll help with organizing my thoughts and will also keep me touching the site (ensuring uptime &gt;.&gt;).<br><br>If you&apos;ve read this far, thanks for your time. I&apos;m sure it wasn&apos;t easy :D</p><p>Yours,<br>Paul (ozzadar)</p>]]></content:encoded></item><item><title><![CDATA[Mario Maker Clone for Godot Dragonbones]]></title><description><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/ipuebAVnqb8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><p>For most of 2020, I&apos;ve been working on a Mario Maker clone built with the Godot engine. Today is the day I give away what I&apos;ve built and beg for coins :)</p><p>Originally, I had plans to make this a commercial project but I kind of got</p>]]></description><link>https://ozzadar.com/mario-maker-clone-for-godot-dragonbones/</link><guid isPermaLink="false">60440cf3dc88ef0001261f15</guid><dc:creator><![CDATA[Paul Mauviel]]></dc:creator><pubDate>Sun, 07 Mar 2021 00:08:00 GMT</pubDate><media:content url="https://ozzadar.com/content/images/2021/03/2021-03-06-18-47-14-1.gif" medium="image"/><content:encoded><![CDATA[<figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/ipuebAVnqb8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><img src="https://ozzadar.com/content/images/2021/03/2021-03-06-18-47-14-1.gif" alt="Mario Maker Clone for Godot Dragonbones"><p>For most of 2020, I&apos;ve been working on a Mario Maker clone built with the Godot engine. Today is the day I give away what I&apos;ve built and beg for coins :)</p><p>Originally, I had plans to make this a commercial project but I kind of got obsessed with other things along the way (including updating, maintaining and releasing Godot Dragonbones) and have decided to move in another direction.</p><p>Namely, I am going to return to VR development in a big way &#x2013; but I&apos;ll talk about that later.<br><br>Anyways, for now I present to you the Mario Maker clone that I&apos;ve been working on. It&apos;s offered as an MIT licensed project that can be used as a learning tool for other developers.<br><br>Additionally, if you&apos;d like to add features, new/better art, etc, feel free to contribute. I won&apos;t disappear completely :)</p><p>If you&apos;d like to support my work, you can do so here via PayPal:</p><!--kg-card-begin: html--><form action="https://www.paypal.com/donate" method="post" target="_top">
<input type="hidden" name="hosted_button_id" value="LE2DJWU8ZXJJC">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" title="PayPal - The safer, easier way to pay online!" alt="Donate with PayPal button">
<img alt="Mario Maker Clone for Godot Dragonbones" border="0" src="https://www.paypal.com/en_CA/i/scr/pixel.gif" width="1" height="1">
</form>
<!--kg-card-end: html--><p>All donations go towards equipment, server costs and future development. If enough interest is shown, I&apos;ll likely follow this article (and accompanying video) with some more in-depth discussions on the various systems in the project.</p><h2 id="demo">Demo</h2><p>If you&apos;d like to play a live service verison in-browser you can visit:<br><a href="https://platformer.ozzadar.com">https://platformer.ozzadar.com</a></p><h2 id="links">Links</h2><p>The project consists of 2 repositories:<br><br>Godot Dragonbones 3.2.52 project:<br><a href="https://github.com/mauville-technologies/Platformer-Maker-Godot">https://github.com/mauville-technologies/Platformer-Maker-Godot</a></p><p>Backend Server:<br><a href="https://github.com/mauville-technologies/Platformer-Maker-Godot-Server">https://github.com/mauville-technologies/Platformer-Maker-Godot-Server</a></p><p>To develop the project, you&apos;ll need:</p><ul><li><a href="https://godotdragonbones.com">Godot Dragonbones 3.2.52</a> (for the client Godot project)</li><li><a href="http://castledb.org/">CastleDB </a>for static database management (tiles, pallettes, etc)</li><li><a href="https://golang.org/">Go programming language</a></li><li><a href="https://www.docker.com/">Docker</a></li></ul>]]></content:encoded></item></channel></rss>