<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ozan Akman</title>
    <description>The latest articles on DEV Community by Ozan Akman (@akmandev).</description>
    <link>https://dev.to/akmandev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1016093%2Fb51fe10b-8ce1-49a9-871f-4c6001031228.jpeg</url>
      <title>DEV Community: Ozan Akman</title>
      <link>https://dev.to/akmandev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akmandev"/>
    <language>en</language>
    <item>
      <title>Understanding Domain-Driven Design (Part 1)</title>
      <dc:creator>Ozan Akman</dc:creator>
      <pubDate>Sun, 14 Jan 2024 11:48:29 +0000</pubDate>
      <link>https://dev.to/akmandev/understanding-domain-driven-design-part-1-ama</link>
      <guid>https://dev.to/akmandev/understanding-domain-driven-design-part-1-ama</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hey there! Today, I’m explaining a good way of developing enterprise software. I’ve spent roughly 10 years in the industry and experienced many different architectures.&lt;/p&gt;

&lt;p&gt;Let me be honest with you, this series won’t be useful if you’re only looking for short-term–rapid application development. I emphasize “short-term” because this is actually faster in the long run. Why? Well, as your product grows to a couple dozen of use cases (if not a hundred), you’ll find yourself fixing a lot of issues. This can slow down your progress in many ways: the release of new features, and bug fixes, onboarding of a new programmer, refactoring, and eventually, creating a bad experience for both you and your users. We’ll explore these issues in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is “Domain” in Domain-Driven Design?
&lt;/h2&gt;

&lt;p&gt;In Domain-Driven Design (DDD), “domain” means the main area or topic that a software system is about. For instance, Facebook is about the social media domain, while Duolingo is about language and education. It’s the area we want to turn into software. This domain represents the real-world concepts, rules, and processes related to that space. The goal is to understand and model the complexities of that space in software. We want to ensure the software meets the requirements and behaves correctly, according to the domain.&lt;/p&gt;

&lt;p&gt;In short, Domain-Driven Design helps you understand your business and users, and create software around their needs. Not influenced by your favorite framework or the preferences of IT people. End-users will never say “Oh look, they’re using the latest JavaScript framework!” unless your target audience consists solely of web developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is a Domain Expert?
&lt;/h2&gt;

&lt;p&gt;Domain experts are individuals with extensive knowledge in a particular field. In healthcare, these experts could be doctors or nurses. In finance, they might be economists. These experts give useful advice during the software design process. Close collaboration with others helps software developers understand the specific knowledge required to create software, instead of just imagining how things should work. This teamwork ensures that the software aligns with real-world needs and functions optimally. If you’re involved in creating a product for a certain time and making decisions within that area, you too are a domain expert!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Domain-Driven Design Important?
&lt;/h2&gt;

&lt;p&gt;Domain-Driven Design (DDD) is important because it helps people to understand key questions like, “What are we solving?”, “Why are we solving this?”, “Who is this for?”. It helps you to understand that you’re solving people’s problems, not computer problems. By abstracting the domain and using it as the foundation for a software project, we can avoid being tied to specific technical terms, frameworks, or libraries. We can change any other parts of the project, as our foundation — the abstracted domain will remain strong. This means our software reflects real-world situations. We can have a shared understanding between our business and technical teams. This method makes it easier for software architectures to adapt and be modular, letting software systems change as requirements change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Examples: Design a Blogging Platform with Domain-Driven Design (DDD)
&lt;/h2&gt;

&lt;p&gt;Throughout some examples, you’ll realize that you have more freedom than you might expect, particularly when compared to a framework-centric approach.&lt;/p&gt;

&lt;p&gt;We’ll be considering a few different strategies, including Screaming Architecture (also known as &lt;a href="https://blog.cleancoder.com/uncle-bob/2011/09/30/Screaming-Architecture.html" rel="noopener noreferrer"&gt;Use-case Driven Approach&lt;/a&gt;), Test-Driven Development (&lt;a href="https://martinfowler.com/bliki/TestDrivenDevelopment.html" rel="noopener noreferrer"&gt;TDD&lt;/a&gt;), and a bit of Command Query Responsibility Segregation (&lt;a href="https://martinfowler.com/bliki/CQRS.html" rel="noopener noreferrer"&gt;CQRS&lt;/a&gt;). Don’t worry if you don’t know these terms, they sound fancy — they’re all tools designed to help solve software design problems.&lt;/p&gt;

&lt;p&gt;As for the examples, I’ll be using PHP, which is my language of choice. However, the beauty of DDD is that it’s not about the language or the framework. It’s about designing a software system. So feel free to use any language you’re comfortable with. But before we start, please forget about how you learned to develop software with frameworks. The first thing you will do would be to install a framework because you will need routing, authentication, or validation, right? Not really, you don’t even have one user, yet. First, you need to abstract your domain away. You don’t need any frameworks or libraries other than a testing framework. Something that helps you to prove your use case works as expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  File Structure
&lt;/h3&gt;

&lt;p&gt;Software design isn’t just about playing with files and folders, arranging them like they’re puzzle pieces. Many developers get stuck in the habit of thinking that designing software is all about arranging files in a certain pattern. What about frameworks? They’re very flexible but they still force their own semantics. They provide a predefined structure, rules, and many different tools, no questions asked, whether you’re building a big blogging platform or a calculator app.&lt;/p&gt;

&lt;p&gt;We’re not jumping into picking a framework right off the bat. Sure, it’s convenient to have folders like &lt;code&gt;App/Models&lt;/code&gt;, &lt;code&gt;App/Controllers&lt;/code&gt;, or &lt;code&gt;App/Events&lt;/code&gt; for your small projects. It’s like a cozy house where everything has its place. But when it comes to expanding an enterprise-level project with hundreds of use cases, this cozy house rapidly turns into a complex maze. Can you imagine a newcomer trying to navigate through this labyrinth? The confusion would lead to endless questions and slow progress.&lt;/p&gt;

&lt;p&gt;So, instead of starting with a framework, we’ll take a different route. We’ll start by defining our domain model and Bounded Contexts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bounded Context: The Building Blocks
&lt;/h3&gt;

&lt;p&gt;When we talk about Domain-Driven Design (DDD), we use the term “Bounded Context” to describe different modules of our software system. Each Bounded Context is unique, focusing on its own tasks, rules, responsibilities, and concepts.&lt;/p&gt;

&lt;p&gt;Let’s consider designing a blogging platform. What are the main components? You might think of elements like the blog posts, the authors, comments, and social interactions such as giving a like or dislike. Each of these elements addresses specific aspects. Let’s inspect each one more closely and give them specific names.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Content Management: This context manages all the content-related entities such as &lt;code&gt;Blog Posts&lt;/code&gt; and &lt;code&gt;Tags&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comment: This context handles all entities related to comments, such as &lt;code&gt;Comments&lt;/code&gt;, &lt;code&gt;Comment Replies&lt;/code&gt;, and &lt;code&gt;Comment Feedback (Likes and Dislikes)&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Author Profile: This context manages the &lt;code&gt;Author&lt;/code&gt; profile page (Bio, profile picture, etc.), and &lt;code&gt;Followers&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Social Interaction: This context covers interactions such as &lt;code&gt;Bookmarking&lt;/code&gt;, &lt;code&gt;Post Feedback (Likes and Dislikes)&lt;/code&gt;, and &lt;code&gt;Subscriptions (Follow and Unfollow)&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User Management: This context takes care of user-related entities such as &lt;code&gt;Settings&lt;/code&gt;, &lt;code&gt;Privacy&lt;/code&gt;, &lt;code&gt;Notifications&lt;/code&gt;, and &lt;code&gt;Premium Subscription&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  A couple of Insights
&lt;/h4&gt;

&lt;p&gt;Something is interesting, the &lt;code&gt;User&lt;/code&gt; represents the same person, but we treat them differently in different Bounded Contexts. Why is that?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the &lt;code&gt;User Management&lt;/code&gt; context, a &lt;code&gt;User&lt;/code&gt; can modify their personal settings, adjust privacy preferences, and manage notification settings.&lt;/li&gt;
&lt;li&gt;In the &lt;code&gt;Content Management&lt;/code&gt; context, the same &lt;code&gt;User&lt;/code&gt; is represented as an &lt;code&gt;Author&lt;/code&gt; who creates, edits or deletes blog posts.&lt;/li&gt;
&lt;li&gt;On the other hand, in the &lt;code&gt;Social Interaction&lt;/code&gt; context, a &lt;code&gt;User&lt;/code&gt; might be someone who bookmarks posts, likes posts or follows other authors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These actors may even share the same name, but they are three distinct actors, each with their own attributes, relationships, and rules within their respective contexts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visualizing Bounded Contexts: Project Structure
&lt;/h3&gt;

&lt;p&gt;One major change we’re making is reconsidering how we organize files and folders. Traditionally, developers have followed specific patterns for arranging them, which is largely dictated by the chosen framework. This approach is not the way for every software project. As we’ve discussed, Domain-Driven Design (DDD) focuses on the purpose of the software, which means our file structure needs to reflect our domain model, not the other way around. So, how do we translate the idea of Bounded Contexts into a practical file structure?&lt;/p&gt;

&lt;p&gt;Let’s begin by creating a separate folder for each Bounded Context in our blogging platform. These folders will serve as the individual homes for each context’s unique rules, tasks, and concepts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└── src
    ├── AuthorProfile
    ├── Comment
    ├── ContentManagement
    |   ├── Post.php
    |   ├── PostRepository.php
    ├── SocialInteraction
    └── UserManagement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, each folder represents a Bounded Context. Even from this high-level view, you can understand the domain of this application without needing to dive deep into the codebase. This is the essence of Screaming Architecture. So, rather than screaming “This is a Laravel app!”, it screams “This is a blogging platform!”.&lt;/p&gt;

&lt;p&gt;But hold on, what about routing? Don’t we need a framework or library for that? Let’s take a step back and remember that we are still in the process of defining our domain and use cases. We are not serving any users, yet.&lt;/p&gt;

&lt;h4&gt;
  
  
  DDD Layers: Domain, Application, Infrastructure
&lt;/h4&gt;

&lt;p&gt;In the DDD world, usually, the applications are layered into the domain, the application, the infrastructure, and perhaps the presentation. We’ve already discussed the domain layer—it’s the heart of our software, encapsulating the business rules and entities.&lt;/p&gt;

&lt;p&gt;The application layer is like the conductor of our software orchestra; it uses the building blocks provided by the domain layer to accomplish specific tasks. Consider a task like &lt;code&gt;PlayMusic&lt;/code&gt;, the application layer coordinates the domain objects like &lt;code&gt;Music&lt;/code&gt; or &lt;code&gt;Artist&lt;/code&gt; to execute this task, guiding the process from start to finish.&lt;/p&gt;

&lt;p&gt;The infrastructure layer, on the other hand, is like the stage where our software orchestra performs. It provides the instruments required by the domain and application layers to function effectively. It supports the performance without dictating the music.&lt;/p&gt;

&lt;p&gt;The presentation layer is where you perform your gig. It's the concert hall.&lt;/p&gt;

&lt;p&gt;Imagine a scenario where your orchestra is restricted to playing in only one place—a stage where you can't move or replace a chair or an instrument. That’s what it feels like when you start your project by choosing a framework. You’re tied to that stage, and any attempt to change a component could break the whole setup. Instead, you should be able to replace infrastructural components at any time without causing a catastrophic failure.&lt;/p&gt;

&lt;p&gt;Now, let’s address a common misconception: while these layers are key to designing your software, they don’t necessarily need to directly translate into your folder structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└── UserManagement
    ├── Application
    ├── Domain
    └── Infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many developers, myself included, have understood these layers as something to be explicitly represented in the codebase, resulting in folder structures like the one above. While this structure is often more manageable than a purely framework-based one or the traditional MVC folders, it still misses the point: DDD is not about folder structures, it’s about software design. The layers should guide your software design as a principle in your mind; it doesn’t have to be a literal representation in your folders. Simply put, you should have a clear mental picture of this layered architecture; it doesn’t have to be exactly reflected in a folder structure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4sd8o0tpb3gyczdp93h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx4sd8o0tpb3gyczdp93h.png" alt="Side by side software architecture comparison"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let’s take a moment to consider the folder structures above – whether you’re an experienced developer or not, think about which one truly makes it easier to maintain the code?&lt;/p&gt;

&lt;h3&gt;
  
  
  Our First Use Case: Creating a Blog Post
&lt;/h3&gt;

&lt;p&gt;The first step in designing our blogging platform using Domain-Driven Design (DDD) is to focus on the use cases. Before we dive into routing, logging, or caching, let’s remember that these are infrastructural concerns and can be easily replaced. We shouldn’t be bound to specific tools; after all, tools are meant to assist us in achieving our goals.&lt;/p&gt;

&lt;p&gt;Let’s start by learning the blueprint of our application. The journey begins from a Bounded Context and then drills down into specific use cases. You have the option to create additional folders to separate sub-contexts, like &lt;code&gt;src/ContentManagement/Post/CreatePost&lt;/code&gt;, instead of &lt;code&gt;src/ContentManagement/CreatePost&lt;/code&gt;. That’s totally fine! The key here is ensuring the folder structure is easy to understand and makes sense to anyone who looks at the codebase. It should focus on the domain logic rather than being overly technical or grouped by file types. We want it to be clear and straightforward so that developers can quickly grasp how everything is organized. With this approach, we can gain a clearer view of our initial design before refining it further.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└──📁src
    └──📁Bounded Context
        ├──📁Use Case 1
        ├──📁Use Case 2
        ├──📄Context Object 1 (e.g. Domain Entity)
        ├──📄Context Object 2 (e.g. Repository Interface)
        └──📄Context Object 3 (e.g. Aggregate Root)

# This translates into something like the following in real-world projects.

└──📁src
    └──📁ContentManagement
        ├──📁CreatePost
        |     ├──📄CreatePost.php
        |     ├──📄PostCreated.php
        ├──📁GetPost
        ├──📄Author.php
        ├──📄Post.php
        ├──📄PublishedPosts.php
        ├──📄PostRepository.php
        └──📄PostRepositoryUsingDoctrine.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Great job finishing Part 1! We’ve learned important concepts like Domain, and Bounded Context. Let me know what you think in the comments! I hope to publish every week, on Sunday. In the next part, I'm aiming to provide more examples and practical use cases. I want to ensure everything is easy to understand.&lt;/p&gt;

&lt;p&gt;If you enjoyed this article, let’s connect on &lt;a href="https://twitter.com/akmandev" rel="noopener noreferrer"&gt;https://twitter.com/akmandev&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/ozanakman" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/ozanakman&lt;/a&gt; for more content like this!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>learning</category>
      <category>development</category>
    </item>
    <item>
      <title>Why is it difficult for many people to create things consistently?</title>
      <dc:creator>Ozan Akman</dc:creator>
      <pubDate>Sat, 06 Jan 2024 17:43:43 +0000</pubDate>
      <link>https://dev.to/akmandev/why-is-it-difficult-for-many-people-to-create-things-consistently-460l</link>
      <guid>https://dev.to/akmandev/why-is-it-difficult-for-many-people-to-create-things-consistently-460l</guid>
      <description>&lt;p&gt;Hey there, today is not about tech talk. I've been thinking about some drafts that have been sitting around untouched for a while. I asked ChatGPT why it's so challenging to create things consistently, but its responses were quite basic, as usual. The question I'm trying to answer is, “Why is it difficult for many people to create things consistently?”.&lt;/p&gt;

&lt;p&gt;Anyway, I just figured it out, it's difficult because it's not fun. It's not engaging at all. Staring at a blank screen and trying to put thoughts into words? Not the most thrilling activity. Expressing what's in your head? Tough stuff. Even experts struggle to explain what they know. Not only that, doing consistent open-source work, or developing your side project in your free time. All of that is difficult.&lt;/p&gt;

&lt;p&gt;It's not just difficult; it's made even more difficult by the complexities of modern life, and all the distractions like social media, Netflix, or video games. Imagine, you have a family with kids. Just thinking about it can be overwhelming, let alone finding the focus. But you know what? Some folks still manage it. How? Well…&lt;/p&gt;

&lt;h2&gt;
  
  
  How do other people do it?
&lt;/h2&gt;

&lt;p&gt;I'll tell you straight ahead. The people I know, they don't really care if something's boring or exciting—they push through regardless. They have control over themselves, and their mind. They look from the perspective, “Okay, this needs to be done”. Sounds easy, but it isn't. This requires discipline. Being able to concentrate, even when you'd rather be doing something else, is an amazing skill. It's kind of what meditation practices teach. So how do you improve that skill?&lt;/p&gt;

&lt;h2&gt;
  
  
  How can you focus on boring tasks?
&lt;/h2&gt;

&lt;p&gt;Our knowledge about our brains today is quite remarkable. I'm not an expert in that area, but I've been diving into neuroscience and the human body lately. Essentially, you've got to train your brain for this. It would help if you learn how to relax and how to lower your stress level, so you have space for other things. I'm pretty sure, you had those days when you stressed yourself with something, out of nowhere. Well, guess what? You can do the exact opposite. You just need to learn how. If you're interested in this topic, I would recommend Wim Hof's breathing technique, it's amazing. I would also suggest listening to a podcast or watching a clip from people like Andrew Huberman. Meditation is another great tool. Sitting there in a stance, and focusing on yourself, telling your mind what to do. It seems boring at first, but it's insanely effective. That's why meditation practices have been passed down through generations. Because it works! The cold showers are fantastic. There are tons of scientific evidence behind it. So, if you're curious, dive into all this stuff, especially on YouTube if videos are more your thing!&lt;/p&gt;

&lt;p&gt;Oh, by the way, our brains aren't the only important bits in our bodies, everything is connected. So, taking care of your whole body is crucial for your brain to perform at its peak. We have a proverb in Turkish that goes something like “A healthy mind in a healthy body”. Exercise regularly, maintain a healthy diet, and ensure good sleep. Don't try to cheat on your body. What are you trying to save? Time or money? At the expense of your own well-being? Take the time to prepare a wholesome meal. Understand your body and its needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand yourself
&lt;/h2&gt;

&lt;p&gt;Creating regularly can be tough, no doubt about it. But remember, every small step counts. Embracing the challenge and staying disciplined, even when it feels hard, leads to wonderful growth. Understand, and don't be so hard on yourself. Be flexible when you need to. Learn how to love the process, not only the outcome. The struggle today becomes the strength tomorrow. If you improve by 1% every week for a year, you will be approximately 164.7% better by the end of the year compared to where you started. You've got this!&lt;/p&gt;

&lt;h2&gt;
  
  
  Stay connected
&lt;/h2&gt;

&lt;p&gt;Thank you for reading! If you enjoyed this article, consider following me on &lt;a href="https://twitter.com/akmandev"&gt;https://twitter.com/akmandev&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/ozanakman"&gt;https://www.linkedin.com/in/ozanakman&lt;/a&gt; for more content like this. I'm trying to regularly share insights on software engineering that can help you improve your skills and stay up-to-date with the latest trends in the industry. I appreciate your support and hope to connect with you soon!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building Beyond Tools: What’s Wrong with Modern Framework-based Development?</title>
      <dc:creator>Ozan Akman</dc:creator>
      <pubDate>Sat, 13 May 2023 09:24:28 +0000</pubDate>
      <link>https://dev.to/akmandev/build-better-apps-become-a-better-developer-3p9b</link>
      <guid>https://dev.to/akmandev/build-better-apps-become-a-better-developer-3p9b</guid>
      <description>&lt;h2&gt;
  
  
  The Road to True Expertise: More Than Just Tools
&lt;/h2&gt;

&lt;p&gt;In modern programming, languages and tools have made it easier than ever to code. You can create a web project without spending four to six years buried in textbooks and lectures. I believe I could teach anyone the basics of web programming in just six short months. However, don't mistake a quick education for mastery. True expertise is earned through years of work, endless failures, and a constant thirst for knowledge. It takes years of practice, study, and engagement with the broader community to truly become an expert in our field. Have you ever tried to explain a difficult concept to an inexperienced developer? Described a solution to a complex problem? Lead group of developers? Documented your code in a way that empowers your colleagues to build on your work? Simply spending time in the industry or having a successful Youtube channel doesn't make you an expert. True expertise comes from deep knowledge and the ability to communicate effectively.&lt;/p&gt;

&lt;p&gt;People who are intelligent and experts in their field, tend to question everything with an open mind and come up with logical reasoning. People who are inexperienced or lack knowledge often have strong opinions and beliefs and are not open to new ideas or ways of thinking. Approach problem-solving with an open mind, question assumptions, and follow the evidence. This is what leads to success in any field, not just intelligence or experience alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Start Your Project by Picking a Framework
&lt;/h2&gt;

&lt;p&gt;As software developers, we are constantly bombarded with new and exciting tools that promise to make our lives easier. While frameworks can be useful tools, they can also lead us down the path of technical debt if we're not careful. The problem with frameworks is that they come with a lot of assumptions about how your application should be structured and what features it should have.&lt;/p&gt;

&lt;p&gt;Write code around the core of your business idea, also known as business logic, rather than around the tools. Let's say you're working on an e-commerce project. Your first concerns should be related to product pricing, inventory management, order processing, and shopping cart. You don't need to worry about user authentication, authorization, or email sending at this stage. By building your foundation around your business logic, you can choose whatever tool or framework you prefer for the infrastructure or UI layer concerns.&lt;/p&gt;

&lt;p&gt;Another example is a social media application, where your focus should be on user profiles, messaging, and content moderation, without concerning yourself with error reporting or caching. Understanding this concept will help you see tools as replaceable parts of your project. It's important to keep in mind that framework creators tend to market their products as must-have tools, and their documentation and tutorials often emphasize using their specific tools for project creation. But with a solid understanding of business logic and the needs of your application, you can choose the right tools to support your project and bring it to life.&lt;/p&gt;

&lt;p&gt;That's where abstraction comes in. Abstraction is the art of simplification - of breaking down complex systems into simpler, more manageable parts. By abstracting away the details of your application's implementation, you can create a more flexible, adaptable architecture that can evolve over time. When we build our application around a framework, we are essentially taking away this flexibility and building on a set of technical debts that we may not fully understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rapid Application Development Doesn't Solve All Your Problems
&lt;/h2&gt;

&lt;p&gt;Rapid application development is encouraged in some communities, such as the Laravel community. They show examples of small teams or solo developers making a lot of money. Tempting. However, this doesn't mean they are creating high-quality software. They usually sacrifice good architecture in order to start their business quickly. And, as they're solo developers, I completely understand. It is effective for them. The problem is that they promote this approach as the way to go! Being a good software architect is not the same thing. It's important to remember that simply knowing how to code does not qualify someone as an industry-leading expert. As I previously stated, anyone can learn the basics of web programming in as little as six months.&lt;/p&gt;

&lt;p&gt;Some people may think that building an application based on business logic is slower than using specific tools. But, it's not always the case. Although it may take some extra time, to begin with, it makes it easier to maintain the code in the long run. Also, you don't need to hire a specialized developer who knows a specific tool, any good developer can understand and work with your code. This saves time and increases flexibility.&lt;/p&gt;

&lt;p&gt;Another benefit of this approach is that the developer will better understand your business. This helps them to contribute better to the project and become a partner in your business's success. Although it may require a little extra work at the beginning, prioritizing business logic over specific tools can have many advantages in the long run.&lt;/p&gt;

&lt;p&gt;In the initial stages of a software project, it's crucial to define the problem you're trying to solve and the objectives you aim to achieve with your solution. By asking these fundamental questions, you can shape your architecture effectively. To this end, it's essential to identify your use cases. A use case is a particular scenario or situation in which your software will be used. This technique helps to ensure that your software satisfies the unique needs of your users, thereby enabling you to create high-quality software that meets their expectations.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's More?
&lt;/h2&gt;

&lt;p&gt;As you are, I am also a learner. Every day, I'm eager to learn what the best approach is. Trying, not to have strong opinions and question everything objectively.&lt;/p&gt;

&lt;p&gt;I am planning to create a series of articles with a lot of code examples. Additionally, I will provide a solid open-source project that you can explore to see how those examples fit into a real project. Let's stay connected!&lt;/p&gt;

&lt;p&gt;Meanwhile, I suggest you read &lt;a href="https://blog.cleancoder.com/uncle-bob/2011/09/30/Screaming-Architecture.html"&gt;Screaming Architecture&lt;/a&gt; by Robert C. Martin (Uncle Bob).&lt;/p&gt;

&lt;p&gt;Thank you for reading! If you enjoyed this article, let me know your opinions in the comments section! You can follow me on &lt;a href="https://twitter.com/akmandev"&gt;https://twitter.com/akmandev&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/ozanakman"&gt;https://www.linkedin.com/in/ozanakman&lt;/a&gt;. I'm trying to regularly share insights on software engineering that can help you improve your skills and stay up-to-date with the latest trends in the industry. I appreciate your support and hope to connect with you soon!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Avoid These 5 Mistakes in Your Software Company</title>
      <dc:creator>Ozan Akman</dc:creator>
      <pubDate>Wed, 19 Apr 2023 08:51:58 +0000</pubDate>
      <link>https://dev.to/akmandev/avoid-these-5-mistakes-in-your-software-company-2gid</link>
      <guid>https://dev.to/akmandev/avoid-these-5-mistakes-in-your-software-company-2gid</guid>
      <description>&lt;p&gt;Throughout my career as a software engineer, I have worked in many different kinds of situations. From small teams to some of the biggest in the industry. The successful ones all had one thing in common: they valued their employees as the cornerstone of their business. In the fast-paced software world, companies might get so focused on delivery that they fail to see their mistakes. We'll go over some typical mistakes I've faced before and wished to change while working at those companies.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Not investing in employees
&lt;/h2&gt;

&lt;p&gt;Employees are the backbone of any business. They form the foundation. It is critical for companies to invest in their employees' personal development. Because it is their skills, expertise, and motivation that result in high-quality products. They are an essential part of your company's success. A poorly trained or demotivated workforce, on the other hand, might result in decreased productivity, higher error rates, missed deadlines, and, ultimately, dissatisfied customers. Do not consider your employees as disposable operation units; doing so will lead to the failure of your organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Not prioritizing automated testing
&lt;/h2&gt;

&lt;p&gt;A lack of expertise can lead to deprioritizing automated testing. The problem is that testing is an essential component of the software development process. Because it doesn't only ensure your product can run smoothly; it also helps identify and resolve issues before they become major problems. Without proper testing, your product will most likely suffer from a range of issues. Unexpected crashes, bugs, errors—you name it. This leads to a negative user experience. Therefore, frustrated users Some critical bugs can even lead to reduced sales or legal issues. Also, without proper testing, you can't refactor your legacy code. I talked about this topic in &lt;a href="https://akman.hashnode.dev/refactoring-legacy-applications"&gt;one of my previous articles&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7Tg9D-Dc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3uodm3xodoiqtl5zkde3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Tg9D-Dc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3uodm3xodoiqtl5zkde3.jpg" alt="IBM System Science Institute Relative Cost of Fixing Defects" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Failing to plan
&lt;/h2&gt;

&lt;p&gt;Planning is a fundamental component of the software development process. It's often overlooked in favor of fast delivery. The pressure to release quickly can lead to rushed coding without sufficient planning, which can result in a range of issues. It can lead to scope creep, poor communication, and, of course, delays. The poor communication results in poor collaboration, and so on. It will drain the limited resources you have, leading to inefficiencies and poor user experiences. Not only that, your employees won't be able to measure their impact and will always feel like they're failing. This will result in employee attrition. &lt;/p&gt;

&lt;p&gt;If you're a small company, I would suggest that you not only listen to your managers but also listen to all of your employees.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Ignoring feedback
&lt;/h2&gt;

&lt;p&gt;We're going to talk about two different types of feedback: employee feedback and customer feedback.&lt;/p&gt;

&lt;p&gt;Employee feedback provides valuable insights into the development process and helps identify improvement areas. If you think you know it all as a manager or fail to take employee feedback seriously, thinking it's unimportant or irrelevant, this will reflect on your company. It will lead to a lack of engagement and motivation among team members. They will feel like their contributions are not valued, so they will contribute the bare minimum. Poor morale, reduced productivity, and high turnover rates result in a costly mistake for your company.&lt;/p&gt;

&lt;p&gt;Besides that, ignoring user feedback is also an equally problematic mistake. Disconnecting your product from the needs of its end users can easily lead to a poor user experience and lost sales. You should use user feedback as a guide to the development process.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Micromanagement
&lt;/h2&gt;

&lt;p&gt;Micromanagement is an absurd management style where managers closely monitor and control those who report to them. I'm sure many of us have dealt with micromanagement at some point in our careers. This will result in a lack of trust between managers and staff, which will lead to less collaboration and communication. It will affect the quality of deliveries. Employees will be disengaged and demotivated. They will feel a lack of autonomy and control over their work. Eventually, there will be less creativity and innovation. &lt;/p&gt;

&lt;p&gt;What actions can you take to avoid micromanagement?&lt;br&gt;
Simple: Trust in your employees. Encourage open communication. Listen to employee feedback and provide feedback back to them regularly. Focus on the outcome. Rather than controlling, provide support and guidance.&lt;/p&gt;

&lt;p&gt;Let me conclude this section with a Steve Jobs quote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The greatest people are self-managing -- they don't need to be managed. Once they know what to do, they'll go figure out how to do it. What they need is a common vision. And that's what leadership is: having a vision; being able to articulate that so the people around you can understand it; and getting a consensus on a common vision.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Stay Connected
&lt;/h2&gt;

&lt;p&gt;Thank you for reading! If you enjoyed this article, consider following me on &lt;a href="https://twitter.com/akmandev"&gt;https://twitter.com/akmandev&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/ozanakman/"&gt;https://www.linkedin.com/in/ozanakman&lt;/a&gt; for more content like this. &lt;/p&gt;

&lt;p&gt;I'm trying to regularly share insights on software engineering that can help you improve your skills and stay up-to-date with the latest trends in the industry. I appreciate your support and hope to connect with you soon!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Refactoring Legacy Applications</title>
      <dc:creator>Ozan Akman</dc:creator>
      <pubDate>Sun, 12 Feb 2023 09:08:30 +0000</pubDate>
      <link>https://dev.to/akmandev/refactoring-legacy-applications-7c5</link>
      <guid>https://dev.to/akmandev/refactoring-legacy-applications-7c5</guid>
      <description>&lt;h2&gt;
  
  
  What's refactoring?
&lt;/h2&gt;

&lt;p&gt;Refactoring is the process of improving the structure of code without changing its behavior. It can increase readability, maintainability, and performance. It can reduce technical debt. When a codebase is cluttered and outdated, there are two options: rewriting the code or refactoring it. While rewriting is easy for developers, it is very expensive. Refactoring can be done without disrupting internal and external processes. This article will guide you through the process of legacy code refactoring and highlight common pitfalls and how to avoid them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps of refactoring a legacy codebase
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Understand&lt;/strong&gt;: To begin, you must understand the current architecture. Take your time learning about its structure and how different parts interact with each other. Are there any patterns? Is there a reason for the complexity?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identify&lt;/strong&gt;: Always look for ways to improve. Is it possible to make the code more readable, maintainable, readable, and scalable?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritize&lt;/strong&gt;: Following your understanding and identification, you can now prioritize the areas that require your focus first. Make a plan to deal with them. Create an Impact Effort matrix (2x2) to understand the potential impact and effort required for each task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup&lt;/strong&gt;: Even though version control systems are already used by the majority of engineering teams, it's a good idea to keep this in mind. Make sure your application is safely backed up in its most recent stable state before making any modifications. Both the data storage and the codebase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test&lt;/strong&gt;: To ensure that the refactoring has not produced any new bugs or unexpected behavior, validate it with automated tests. Write your tests against desired behavior. If there are existing tests, keep them to validate that the changes have not produced any side effects. The rule is simple: If you can test it, you can refactor it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decompose&lt;/strong&gt;: When broken up into small pieces, it is simpler to handle the refactoring process. You can isolate those parts and have the option to test those smaller components separately. Additionally, breaking things into tiny pieces makes it simpler to evaluate your impact. It's much simpler to understand and document the smaller part.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document&lt;/strong&gt;: Start keeping track of the procedure. Document your understanding and any changes you make. Ensure consistency between your refactoring approach and the documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeat&lt;/strong&gt;: Keep repeating the process until all necessary components of the application are improved. Refactoring a legacy app is not a straightforward, one-day task; it requires ongoing planning and execution.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why would refactoring even be necessary?
&lt;/h2&gt;

&lt;p&gt;Let's imagine! You have a large service called &lt;code&gt;Printer&lt;/code&gt; that has numerous dependencies. And it wasn't always this way. The first code was written ten years ago by two college friends. It was intended to print two simple tables. The developers felt there was no need to make it complicated. They decided that they will easily create a simple service to handle those tables. There were two methods in the service: &lt;code&gt;printEmployeesTable()&lt;/code&gt; and &lt;code&gt;printDocumentsTable()&lt;/code&gt;. Those methods simply converted tables to pdf format. As a result, the first dependency was a service called &lt;code&gt;HtmlToPdfConverter&lt;/code&gt;. Fast forward to today, their product is a success story. They've been adding new features and appealing to larger audiences since then. As an outcome, more printing methods were required, such as &lt;code&gt;printSalariesTable()&lt;/code&gt;, &lt;code&gt;printTranslationsTable()&lt;/code&gt;, and so on.&lt;/p&gt;

&lt;p&gt;However, it wasn't that simple. They had to expand the capabilities of the &lt;code&gt;Printer&lt;/code&gt; service because their audience was larger.  Such as queues, printing in several formats, permission, and much more. You might also assume that the dependencies started growing at the same pace. When new developers joined the team, they just followed the proven procedures. They didn't want to break it. The &lt;code&gt;Printer&lt;/code&gt; could print approximately 100 different outputs after ten years of development, each with a corresponding so-called "simple" printing method. The &lt;code&gt;Printer&lt;/code&gt; service and the other components are tightly coupled. Even though that service still functions today, it now contains at least 10,000 lines of code and perhaps 20 or even more dependencies. Making changes is a headache because it is not readable anymore. All printing methods are all out of sync and operate in different ways. You cannot just decide to add CSV printing functionality to all tables. It's quite difficult to keep it stable and bug-free. However, this is not the end of it. Your clients want the same print functionality for a feature you're planning to release. The tricky part is that you need another dependency in order to print this new output. What will you do in this situation? Does it make sense to add a dependency and a new method to the &lt;code&gt;Printer&lt;/code&gt;? When there are already more than 20 dependencies? Dr. Refactoring, we need your superpowers!&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge to the rescue
&lt;/h2&gt;

&lt;p&gt;As we already know, practically every other component highly depends on the &lt;code&gt;Print&lt;/code&gt; service. How can we even take a small piece of it out without affecting the other components?&lt;/p&gt;

&lt;p&gt;I'll give you a hint: There is a solution to this problem, and there will always be a solution. For this new feature, you should start with creating a test case. Once you have a failing test case, you can start the decomposition. The decorator pattern, for example, could be useful in that situation. You may make a standalone &lt;code&gt;NewFeaturePrinter&lt;/code&gt; and decorate the good old &lt;code&gt;Printer&lt;/code&gt; service. You may encapsulate the logic of the &lt;code&gt;NewFeaturePrinter&lt;/code&gt; in itself this way. It can be tested in isolation. The old &lt;code&gt;Printer&lt;/code&gt; doesn't even need to be changed, and it is unaware of the &lt;code&gt;NewFeaturePrinter&lt;/code&gt;. At the very least, it's a much better alternative than adding more complexity to the already-existing &lt;code&gt;Printer&lt;/code&gt;. The decorator pattern could also help you in breaking down this large service into smaller ones, more manageable pieces, especially when your components are tightly coupled. Perhaps you can resolve this issue without even using a pattern. The idea is that we should figure out a way to separate it into encapsulated chunks. This description of decomposition is also known as the Extract Method, a well-known refactoring technique.&lt;/p&gt;

&lt;p&gt;There are many design patterns and several different techniques. Almost all of them were motivated by a specific problem. Increasing your knowledge could save you and your team a significant amount of time and money. Most businesses are unaware of their technical debt until it is too late. Refactoring should be an ongoing process for legacy applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts: Keep it simple
&lt;/h2&gt;

&lt;p&gt;Each team is organized differently. Finding one single way to manage this process for all is challenging. However, you can always follow the steps I defined above. Not everything needs to be refactored at once. Begin with renaming. Begin with breaking down complex services into simpler ones. Leverage design patterns. Learn from your own mistakes. Decouple and encapsulate your components. Test in isolation. Progressively get away from the complexity. And repeat.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Symfony is not the best framework.</title>
      <dc:creator>Ozan Akman</dc:creator>
      <pubDate>Sun, 29 Jan 2023 08:53:36 +0000</pubDate>
      <link>https://dev.to/akmandev/symfony-is-not-the-best-framework-4ipc</link>
      <guid>https://dev.to/akmandev/symfony-is-not-the-best-framework-4ipc</guid>
      <description>&lt;p&gt;Initially, I wanted to reply to a Reddit &lt;a href="https://www.reddit.com/r/PHP/comments/10mbfuv/comment/j6665hq/?utm_source=share&amp;amp;utm_medium=web2x&amp;amp;context=3"&gt;comment&lt;/a&gt;. It was already long enough to classify as a blog post. I hope you enjoy reading it. Let me know your thought on the comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simply put, Symfony isn't ideal for every situation.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Who am I?
&lt;/h2&gt;

&lt;p&gt;I'm Ozan Akman, an experienced full-stack developer. I've worked with Laravel, Laminas (formerly Zend), and Symfony for many years. I've spent the last five years working for product companies. So, enterprise-level PHP frameworks were always on my radar. Due to my new employment, I shifted to backend development 1.5 years ago. Since that shift, Symfony is what I use. I love it. But must admit that I've seen some terrible Symfony apps. The developers who built a beautiful architecture that is enjoyable to work with are responsible for this "love it" experience, not the framework itself.&lt;/p&gt;

&lt;p&gt;There are several requirements, but let's try to figure it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Symfony best at?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; Development speed? Laravel is much faster than Symfony.&lt;/li&gt;
&lt;li&gt; Overall development experience? When you get used to it and properly put it up, Symfony is pretty good.&lt;/li&gt;
&lt;li&gt; Learning curve? Symfony is not the best choice.&lt;/li&gt;
&lt;li&gt; Documentation? Symfony is effective but messy at the same time. It could be improved.&lt;/li&gt;
&lt;li&gt;Configuration? Symfony is a fantastic choice.&lt;/li&gt;
&lt;li&gt;Dealing with complexity? Symfony is one of my best experiences to solve complicated challenges with ease.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the end, it all comes down to your goals.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the best PHP framework?
&lt;/h2&gt;

&lt;p&gt;Do you have limited resources and need to complete projects quickly? Laravel is a fantastic option. Do you prefer less magic and more stable ground? Symfony is a fantastic option. Will you be handling the client code? or designing an API only? Symfony is a fantastic option. But it couldn't even come closer to Laravel's full-stack capabilities. Testing with both frameworks is a joy Do you really need so much flexibility? Laminas is great and flexible but it makes things harder and DX isn't the best. You deliver slower than other frameworks.&lt;/p&gt;

&lt;p&gt;Every framework can scale. Each and every framework has excellent tooling. To be honest, working with nearly any advanced PHP framework is a joy. We have options, which is great.&lt;/p&gt;

&lt;h2&gt;
  
  
  My personal experience with frameworks
&lt;/h2&gt;

&lt;p&gt;And again, I love Symfony. Two months ago, I started working on weekend projects, and Symfony was my first pick. After a month, I made the decision to try Laravel because I believed I could develop more quickly with it. That was true. I have a nice speed boost thanks to Laravel. You should know that I haven't worked with Laravel in about five years. There were a few tweets and stories that I saw, but that was it. For many years, I lacked first-hand experience. I could change to it so quickly. It was quite surprising. And the combination of Laravel and Inertia is simply amazing. Everything depends on the content and timing of your delivery.&lt;/p&gt;

&lt;p&gt;I can also see why Laravel is so hated, especially among experienced developers. It has a feature called Facade that allows you to access objects from a container. I try to avoid using the Facade feature because it feels like too much magic. Of course, you are free to use dependency injection. But Laravel forces you to use its own methods, you're not as remotely free as Symfony's flexibility. It lacked proper type hinting for so long. Unquestionably, there is room for improvement. Laravel isn't the best, but it does the job for a full-stack project with just a solo programmer.&lt;/p&gt;

&lt;h2&gt;
  
  
  You're the best framework
&lt;/h2&gt;

&lt;p&gt;I intentionally stated that "it is not the best framework" for all of the mentioned frameworks above because none of them is the best. You need to make the most of them.&lt;br&gt;
You need to focus on creating your system using design patterns, having a good architecture (e.g. hexagonal architecture), and around DDD principles.&lt;br&gt;
The next time you choose one of those frameworks, you need to focus on delivery and timing. You need to decide what's the best framework for you.&lt;br&gt;
In the end, there is no such thing as "the best" framework. It all depends on you!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>symfony</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Understanding black-box and white-box testing</title>
      <dc:creator>Ozan Akman</dc:creator>
      <pubDate>Sat, 28 Jan 2023 10:57:10 +0000</pubDate>
      <link>https://dev.to/akmandev/understanding-black-box-and-white-box-testing-242m</link>
      <guid>https://dev.to/akmandev/understanding-black-box-and-white-box-testing-242m</guid>
      <description>&lt;h2&gt;
  
  
  What is black-box testing?
&lt;/h2&gt;

&lt;p&gt;Black-box testing is a method of software testing that examines the functionality of an application without peering into its internal structures or workings. It is also known as functional testing or behavioral testing. The tester is only concerned with what the application does, not how it does it. The goal of black-box testing is to ensure that the application meets its requirements and behaves as expected for the end user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should we test internal parts with functional test cases?
&lt;/h2&gt;

&lt;p&gt;Functional testing, also known as black-box testing, is focused on testing the software application's external behavior and functionality, as seen from the end user's perspective. It is not typically used to test the internal workings or structure of the application.&lt;/p&gt;

&lt;p&gt;Internal parts of an application, such as individual modules or components, are typically tested using unit testing, which is a method of testing individual pieces of code in isolation. Developers typically write unit tests to verify that the code they have written is working correctly and meets the requirements.&lt;/p&gt;

&lt;p&gt;That being said, it is possible to have functional test cases that test the internal parts of the application by testing the interaction of different internal components, in this case, it's called integration testing. This method of testing ensures that the various parts of the application are working together correctly and that there are no conflicts or issues when they are integrated.&lt;/p&gt;

&lt;p&gt;In summary, functional testing is focused on the external behavior and functionality of the application, while unit testing and integration testing are focused on the internal parts of the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the key differences between black-box and white-box testing?
&lt;/h2&gt;

&lt;p&gt;Black-box testers only have access to the inputs and outputs of the application, and not to the internal code. This method of testing is used to ensure that the application behaves as expected for the end user and meets its requirements.&lt;/p&gt;

&lt;p&gt;On the other hand, white-box testers have access to the internal code and design of the application and use this information to test individual pieces of code to ensure that they are working correctly. This method of testing is used to ensure that the application is functioning correctly at the code level and to identify any bugs or issues that may not be visible from the user's perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  In summary, the key differences:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Black-box testing is done from the user's perspective, while white-box testing (unit, integration, etc.) is done from the developer's perspective.&lt;/li&gt;
&lt;li&gt;Black-box testing does not require access to the internal code, while white-box testing requires access to the internal code.&lt;/li&gt;
&lt;li&gt;Black-box testing is focused on testing the external functionality and behavior of the application, while white-box testing is focused on testing the internal code and design.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sources:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-192.pdf" rel="noopener noreferrer"&gt;https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-192.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ChatGPT&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>laravel</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
