<?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>Forem: Muhamad Sulaiman</title>
    <description>The latest articles on Forem by Muhamad Sulaiman (@msulaimanmisri).</description>
    <link>https://forem.com/msulaimanmisri</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%2F622984%2Fac23261b-571e-4e58-be95-b7a96ec1efc5.jpeg</url>
      <title>Forem: Muhamad Sulaiman</title>
      <link>https://forem.com/msulaimanmisri</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/msulaimanmisri"/>
    <language>en</language>
    <item>
      <title>Beyond CRUD: The Developer’s Ascent – A Story of Growth</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Sun, 23 Nov 2025 04:17:00 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/beyond-crud-the-developers-ascent-a-story-of-growth-486c</link>
      <guid>https://forem.com/msulaimanmisri/beyond-crud-the-developers-ascent-a-story-of-growth-486c</guid>
      <description>&lt;p&gt;Based on my personal experience. But blend with a Journalist-like story to make it more interesting.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.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%2Fiwb4rec71xhwl4ojqc15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fiwb4rec71xhwl4ojqc15.png" alt="Author-codes-in-the-room" width="800" height="682"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kuala Lumpur — It’s a scene familiar to many in the tech world: a young developer, lit by the glow of a laptop screen, celebrates the launch of their first simple web application. But for seasoned software engineer Ahmad (not his real name), that moment was just the first step of a decade-long journey climbing from novice coder to technical architect—a journey marked less by the mastery of CRUD (Create, Read, Update, Delete) and more by a relentless pursuit of growth and complexity.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;“I still remember the first time my own app let someone add and delete a note,” Ahmad recalls. “It felt like magic. CRUD opened the gate to programming for me. But I eventually realized it’s really just basic survival.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;For years, CRUD skills sufficed. Ahmad bounced between languages—PHP, JavaScript, Go—building countless forms and tables, spinning up databases, and deploying apps that managed users and lists. The early victories, however, gave way to a sense of monotony. “It’s easy to fall into the loop,” he says. “Every project starts to look the same. You wonder, is this all I’m going to do?”&lt;/p&gt;




&lt;p&gt;Industry veterans say that realization marks an important inflection point—the plateau that separates junior developers from their more senior peers. “Moving past CRUD is not about abandoning the basics,” says Maya, Ahmad’s former mentor and team lead. “It’s about asking bigger questions: How does this system work for the business? What happens if traffic doubles? If a bug wipes out the database, are we ready?”&lt;/p&gt;




&lt;p&gt;For Ahmad, the turning point came when his team was tasked with integrating real-time payments and automated reporting into their platform. CRUD apps, he discovered, could not answer questions about reliability, scalability, error recovery, or business impact. “Suddenly, I had to think like an architect, not a form designer,” he tells us. “From database indexing to API reliability, every decision mattered.”&lt;/p&gt;




&lt;p&gt;The role of a Senior Developer, Ahmad explains, is less about coding individual features and more about designing systems and processes. He describes late nights debugging production issues, painstaking data modeling, and the challenge of translating technical risks to cross-department stakeholders. “You don’t just write the code. You explain why, negotiate trade-offs, and make sure the solution actually solves a real-world problem.”&lt;/p&gt;




&lt;p&gt;Beyond the technical, communication skills emerge as critical. “The bigger the system, the more people involved,” Ahmad notes. “You need to speak business, not just code. Convincing marketing or ops to invest in better logging or infrastructure—that's what really moves projects forward.”&lt;/p&gt;




&lt;p&gt;This ethos of perpetual learning runs deep. Technologies like Laravel Collections, he says, seem straightforward—until new custom methods reinvent familiar workflows. Ahmad regularly returns to old documentation, finding surprises in the details. “Even when it’s a repeat topic, there’s always something new,” he reflects. “The best engineers constantly re-learn and re-invest in their fundamentals.”&lt;/p&gt;




&lt;p&gt;Experts echo this view. “In the real world, seniors spend as much time mentoring, designing, and testing as they do coding,” Maya explains. “The real ascent is about growing as a leader and problem-solver, not just a programmer.”&lt;/p&gt;




&lt;p&gt;Today, Ahmad mentors teams across departments, reviews code, drafts architectural diagrams, and steers projects from conception to completion. “I see junior devs excited about CRUD. I tell them it’s a great start. But don’t stop there—your road is far longer and richer.”&lt;/p&gt;




&lt;p&gt;As the tech world races forward, Ahmad’s story serves as both blueprint and inspiration—a testament to the climb from CRUD to creativity, from novice to senior, and from solitary coder to collaborative leader.&lt;/p&gt;




&lt;p&gt;“CRUD is the start of the story,” Ahmad concludes, “but the most exciting chapters come after.”&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>programming</category>
      <category>careerdevelopment</category>
    </item>
    <item>
      <title>Understanding Polymorphism vs. Polymorphic in Programming</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Fri, 07 Feb 2025 07:04:12 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/understanding-polymorphism-vs-polymorphic-in-programming-471n</link>
      <guid>https://forem.com/msulaimanmisri/understanding-polymorphism-vs-polymorphic-in-programming-471n</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you've ever dived into Object-Oriented Programming (OOP) or worked with an ORM like Laravel's Eloquent, you've likely come across the terms &lt;code&gt;Polymorphism&lt;/code&gt; and &lt;code&gt;Polymorphic Relationship&lt;/code&gt; (will use Polymorphic after this). While they sound similar, they refer to two distinct concepts.&lt;/p&gt;

&lt;p&gt;Many developers, especially those new to these concepts, often confuse them. In this post, I'll break down what each term means, how they are used, and &lt;strong&gt;why understanding the difference is crucial for writing clean and efficient code.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Polymorphism?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Polymorphism&lt;/code&gt; is a fundamental concept in Object-Oriented Programming (OOP) that allows objects of different classes to be treated as objects of a common superclass. It enables a single interface to be used with different underlying data types, improving code reusability and flexibility.&lt;/p&gt;

&lt;p&gt;There are two primary types of polymorphism. &lt;code&gt;Method Overriding&lt;/code&gt; and &lt;code&gt;Method Overloading&lt;/code&gt;. For the sake of the PHP and this sharing, we focus on the first type only.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example of Polymorphism in PHP (Method Overriding)
&lt;/h3&gt;

&lt;p&gt;Let's take a real-world example. Assume we have a User system where different types of users (Admin, Customer) have different access levels.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
* Main (or Parents) Class
*/&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getRole&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"General User"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/**
* Child Class
*/&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Admin&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getRole&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Administrator - Full Access"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/**
* Child Class
*/&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Customer&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getRole&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Customer - Limited Access"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/**
* Instantiate the Class - Object
*/&lt;/span&gt;
&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Admin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;()];&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRole&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Administrator&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;Full&lt;/span&gt; &lt;span class="nc"&gt;Access&lt;/span&gt;
&lt;span class="nc"&gt;Customer&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;Limited&lt;/span&gt; &lt;span class="nc"&gt;Access&lt;/span&gt;
&lt;span class="nc"&gt;General&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, even though we are calling &lt;code&gt;getRole()&lt;/code&gt; on different objects, they return different results based on their respective class implementations. &lt;strong&gt;This is the power of polymorphism&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ok now, I hope you understand about &lt;code&gt;polymorphism&lt;/code&gt;. Let's go to other terms, &lt;code&gt;polymorphic&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a Polymorphic?
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;Polymorphic&lt;/code&gt; is a database design pattern used in Object-Relational Mapping (ORM) systems like Laravel's Eloquent. It allows a single model to be associated with multiple other models without needing multiple foreign keys.&lt;/p&gt;

&lt;p&gt;For example, let's say we have an &lt;code&gt;Image&lt;/code&gt; model that can be associated with both a &lt;code&gt;Post&lt;/code&gt; and a &lt;code&gt;User&lt;/code&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Instead of creating separate &lt;code&gt;post_id&lt;/code&gt; and &lt;code&gt;user_id&lt;/code&gt; columns in the images table, we use a polymorphic relationship with imageable_id and imageable_type columns.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Example of Polymorphic Relationship in Laravel
&lt;/h3&gt;

&lt;p&gt;In your migration file :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'images'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;morphs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'imageable'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your Model :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
* Image Class
*/&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Image&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;imageable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;morphTo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/**
* Post Class
*/&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;morphMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'imageable'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/**
* User Class
*/&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;morphMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'imageable'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this codes, you can do like this when Data Creation :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;images&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'post_image.jpg'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;images&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'profile_picture.jpg'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, both &lt;code&gt;Post&lt;/code&gt; and &lt;code&gt;User&lt;/code&gt; models can have associated &lt;code&gt;images&lt;/code&gt; without needing separate foreign keys.&lt;/p&gt;




&lt;h2&gt;
  
  
  Polymorphic Relationships Exist Beyond Laravel
&lt;/h2&gt;

&lt;p&gt;Although Laravel has made Polymorphic relationships popular in the PHP ecosystem, this concept exists in other frameworks and ORMs such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Django (Python) – Uses Generic Foreign Key&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hibernate (Java) – Uses Single Table Inheritance or Join Table Inheritance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Both &lt;code&gt;Polymorphism&lt;/code&gt; and &lt;code&gt;Polymorphic&lt;/code&gt; are crucial concepts, but they serve different purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Polymorphism&lt;/code&gt; is an OOP concept that allows multiple classes to share the same interface and behave differently based on their implementation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Polymorphic&lt;/code&gt; usually referred as &lt;code&gt;Polymorphic Relationship&lt;/code&gt; are a database ORM feature that allows a single model to relate to multiple other models dynamically.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  To visualize the difference
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Polymorphism&lt;/code&gt; is like having different types of users (Admin, Customer, Guest) who inherit from a common &lt;code&gt;User&lt;/code&gt; class but override methods to behave differently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Polymorphic&lt;/code&gt; are like an &lt;code&gt;Image&lt;/code&gt; table where a single image can belong to either a Post, a User, or even a Product, without needing multiple foreign keys.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;&lt;u&gt;Understanding the difference between these two concepts helps you write cleaner, more maintainable, and scalable code&lt;/u&gt;&lt;/strong&gt;. Whether you’re designing an object-oriented system or a database schema, knowing when and how to use polymorphism can make a huge difference in your project's architecture.&lt;/p&gt;

&lt;p&gt;Even there's some Cons. But I don't want to explain it here. Now, it's your job to find the Cons ;)&lt;/p&gt;

&lt;p&gt;I'm sure you have implemented the &lt;code&gt;polymorphism&lt;/code&gt; in your Laravel project. But Have you used polymorphic relationships in your projects? Let me know in the comments below! 🚀&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>oop</category>
      <category>database</category>
    </item>
    <item>
      <title>Understanding Laravel Queues: queue:work vs queue:listen and Why queue:restart Matters</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Sat, 01 Feb 2025 13:51:09 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/understanding-laravel-queues-queuework-vs-queuelisten-and-why-queuerestart-matters-33cc</link>
      <guid>https://forem.com/msulaimanmisri/understanding-laravel-queues-queuework-vs-queuelisten-and-why-queuerestart-matters-33cc</guid>
      <description>&lt;p&gt;Recently, I released a Laravel package called &lt;a href="https://github.com/msulaimanmisri/easy-deploy" rel="noopener noreferrer"&gt;EasyDeploy&lt;/a&gt;, and someone asked me why I included &lt;code&gt;php artisan queue:restart&lt;/code&gt; instead of just using &lt;code&gt;php artisan queue:work&lt;/code&gt; or &lt;code&gt;php artisan queue:listen&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This question made me realize that many developers aren't fully aware of how Laravel's queue system works, especially when using Supervisor. So in this post, let's break it down step by step.&lt;/p&gt;

&lt;p&gt;By the way, I will shorten the command to like &lt;code&gt;queue:work&lt;/code&gt;. I hope you can understand that it's mean &lt;code&gt;php artisan queue:work&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;code&gt;queue:work&lt;/code&gt; vs &lt;code&gt;queue:listen&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Before we talk about queue:restart, let's first understand the difference between &lt;code&gt;queue:work&lt;/code&gt; and &lt;code&gt;queue:listen&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠 php artisan queue:work
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Runs a queue worker once and then exits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Since Laravel now runs &lt;code&gt;queue:work&lt;/code&gt; in daemon mode by default, you can simply use:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan queue:work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Because of &lt;code&gt;queue:work&lt;/code&gt; runs in daemon mode by default, the worker stays running without restarting Laravel for every job, making it &lt;strong&gt;faster&lt;/strong&gt; and &lt;strong&gt;more efficient for production&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎧 php artisan queue:listen
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Listens for new jobs continuously.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restarts Laravel for every job, which ensures fresh code &lt;strong&gt;but makes it slower than queue:work&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Good for development, but &lt;strong&gt;not recommended for production&lt;/strong&gt; due to performance overhead.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Which One to Use?
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;queue:work&lt;/code&gt; in production for better performance since it already runs in daemon mode by default.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;queue:listen&lt;/code&gt; in development when you want changes to be reflected immediately without restarting the worker.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Why queue:restart Is Necessary
&lt;/h2&gt;

&lt;p&gt;Now that we understand the difference, let's talk about &lt;code&gt;queue:restart&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Even if you're using &lt;code&gt;queue:work&lt;/code&gt;, the worker keeps running indefinitely. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you deploy new code, the worker still runs old code because it never restarted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you update a model, job, or database structure, the queue worker won’t pick up the changes. Because the worker does not automatically reload the application state.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To solve this, Laravel provides:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan queue:restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command signals all workers to gracefully exit after finishing their current job, allowing them to be restarted and reload the updated code.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 How Supervisor Fits In
&lt;/h2&gt;

&lt;p&gt;Many Laravel developers use &lt;a href="https://supervisord.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Supervisor&lt;/strong&gt;&lt;/a&gt; to keep queue workers running.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Supervisor auto-restarts workers if they crash, ensuring that queue jobs are always processed.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;However, &lt;strong&gt;Supervisor does not restart workers when you deploy new code.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This is why &lt;code&gt;queue:restart&lt;/code&gt; is important: it tells existing workers to stop so that Supervisor can restart them with the latest code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 Without &lt;code&gt;queue:restart&lt;/code&gt;, your queue workers might continue using old code after deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Best Practices for Laravel Queues in Production
&lt;/h2&gt;

&lt;p&gt;When deploying updates, always do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan migrate --force
php artisan queue:restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that:&lt;/p&gt;

&lt;p&gt;✅ Database migrations apply correctly.&lt;/p&gt;

&lt;p&gt;✅ Queue workers reload the latest code.&lt;/p&gt;

&lt;p&gt;✅ No jobs get stuck due to outdated logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This command is included in my package. I'm using this for years&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Understanding how Laravel queues work is crucial for building reliable and scalable applications. If you're using Supervisor, make sure to include &lt;code&gt;queue:restart&lt;/code&gt; in your deployment workflow to prevent workers from running outdated code.&lt;/p&gt;

&lt;p&gt;I hope this post clarifies the difference between &lt;code&gt;queue:work&lt;/code&gt;, &lt;code&gt;queue:listen&lt;/code&gt;, and why &lt;code&gt;queue:restart&lt;/code&gt; is necessary.&lt;/p&gt;

&lt;p&gt;If you're interested in automating your Laravel deployments, check out &lt;a href="https://github.com/msulaimanmisri/easy-deploy" rel="noopener noreferrer"&gt;EasyDeploy&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Have any questions? Let's discuss in the comments! 🚀&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>supervisor</category>
      <category>php</category>
      <category>queue</category>
    </item>
    <item>
      <title>My Journey from BootstrapCSS to TailwindCSS: A Backend Developer’s Perspective</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Thu, 03 Oct 2024 01:44:59 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/my-journey-from-bootstrapcss-to-tailwindcss-a-backend-developers-perspective-2n1c</link>
      <guid>https://forem.com/msulaimanmisri/my-journey-from-bootstrapcss-to-tailwindcss-a-backend-developers-perspective-2n1c</guid>
      <description>&lt;p&gt;As a backend developer, my journey in the world of web development has been filled with learning and adapting to new technologies. Recently, I made the switch from BootstrapCSS (Bootstrap) to TailwindCSS (Tailwind), and I’d like to share my experience along with a comparison of both frameworks.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;/p&gt;

&lt;h2&gt;
  
  
  Discovering Tailwind: From Skepticism to Adoption
&lt;/h2&gt;

&lt;p&gt;I first came across Tailwind through the front-end community. I’ve been following Adam Wathan, the founder of Tailwind, since he published his course about Laravel. However, at the time, I was more into Bootstrap because, as a backend developer, front-end styling wasn’t my priority.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
But as time went on, I had to evolve into a Full Stack Developer. When working with frameworks like Laravel and WordPress, companies expect you to handle both backend and frontend. This shift pushed me to rethink my approach to front-end development, and eventually, my frustrations with Bootstrap led me to explore Tailwind.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
Before Tailwind, I even tried Bulma, but the community wasn't as active or supportive compared to Tailwind and Bootstrap.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
What made Tailwind even more appealing was how I could avoid writing separate CSS files. With Tailwind’s utility-first approach, I could apply styles directly within the Blade or PHP files, similar to inline styling but with more power and time efficiency. It saved me the hassle of going back and forth between CSS and HTML, making development much smoother.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance and Flexibility: Why Tailwind Wins for Me
&lt;/h2&gt;

&lt;p&gt;When it comes to performance, Tailwind edges out Bootstrap, especially with its JIT (Just-in-Time) compilation and tree-shaking mechanism. With Bootstrap, you often end up loading a ton of unused CSS classes, which can bloat the file size. Tailwind, on the other hand, compiles only the classes I use. This results in a leaner, more efficient CSS file, directly improving page load times and overall performance.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
As for flexibility, Tailwind offers way more freedom than Bootstrap. In Bootstrap, while there’s customization available through SCSS or LESS, it often feels like an extra step. Tailwind, however, gives you customization directly through utility classes. Need a specific width? No problem—use w-[200px] or w-[50em]. Want a custom background with transparency? bg-pink-500/20 gets the job done.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
This design freedom makes Tailwind powerful, allowing me to create exactly what I envision without writing custom CSS files or relying on pre-designed components.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;/p&gt;

&lt;h2&gt;
  
  
  Adjusting to Tailwind: A Learning Curve
&lt;/h2&gt;

&lt;p&gt;One of the key reasons my development slowed down when switching to Tailwind was the shift in approach. With Bootstrap, a lot of the heavy lifting is done for you. Bootstrap comes packed with pre-built components like btn, nav, container, and more. It’s quick and easy to implement, often requiring just a few classes to achieve a fully functional and styled element.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
On the other hand, Tailwind takes a more utility-first approach. Instead of pre-built components, you’re in control of each aspect of the design. For example, creating a simple button in Bootstrap is as quick as writing btn btn-primary. In Tailwind, you need to manually define each property like rounded-md p-4 text-white bg-blue-500 hover:bg-blue-300. This gives you more design flexibility but also increases the amount of code you write.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
This learning curve and extra level of detail in styling make Tailwind slower at first. You’re responsible for crafting each component from scratch, which takes more time compared to using Bootstrap’s ready-to-use components. However, once you get the hang of Tailwind, the payoff in terms of performance, customization, and design freedom becomes clear.&lt;br&gt;
⁣&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Lessons Learned: Transitioning to Tailwind
&lt;/h2&gt;

&lt;p&gt;Switching to Tailwind wasn’t without its challenges. As someone who initially focused on backend development, adjusting to a utility-first CSS framework like Tailwind required a shift in mindset. Unlike Bootstrap, which offers pre-built components and a structured approach to UI design, Tailwind forces you to build everything from the ground up.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
The challenge was in balancing flexibility with the learning curve. Initially, it felt like I was spending more time manually writing classes for every design element, which slowed down my development process. There was also a period where I struggled to remember Tailwind’s utility classes, making it harder to develop quickly compared to Bootstrap’s familiar component classes.&lt;br&gt;
⁣&lt;/p&gt;

&lt;p&gt;However, the key lesson I learned was patience. Once I got over the initial learning curve, Tailwind became second nature. I realized that while the upfront effort is higher, the long-term gains in flexibility and performance were worth it. The framework’s approach to responsive design, customization, and optimization pays off in larger projects, especially when performance is critical.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
Advice for Developers Transitioning to Tailwind&lt;br&gt;
For front-end developers, Tailwind will feel like home. The utility-first approach gives you granular control over every aspect of the design, allowing you to build responsive and high-performance websites with ease. If you enjoy customizing layouts and fine-tuning the look of your site, Tailwind is perfect for you.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
For back-end developers, my advice is to start with Bootstrap. Learn and get comfortable with CSS concepts first. Bootstrap’s structured component system will help you ease into front-end development. Once you’re comfortable with the basics of CSS, consider moving to Tailwind to unlock its full potential for performance and design flexibility.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
If you want to go faster, consider asking your designer to create the mockups first. This way, you’ll have a clear visual guide on how to bring your designs to life using Tailwind.&lt;br&gt;
⁣&lt;br&gt;
⁣&lt;br&gt;
In modern website design, performance is just as important as UI. Don’t overlook this aspect. Tailwind’s JIT compilation and efficient CSS bundle make it a great option for developers who prioritize speed and user experience. It’s important to balance aesthetics with functionality, ensuring that your websites not only look good but perform well too.&lt;br&gt;
⁣&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>bootstrap</category>
      <category>frontend</category>
      <category>backend</category>
    </item>
    <item>
      <title>Embracing Agile, Scrum, and Kanban in Project Management: A Personal Journey</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Mon, 30 Sep 2024 12:51:32 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/embracing-agile-scrum-and-kanban-in-project-management-a-personal-journey-54jn</link>
      <guid>https://forem.com/msulaimanmisri/embracing-agile-scrum-and-kanban-in-project-management-a-personal-journey-54jn</guid>
      <description>&lt;p&gt;Managing projects in a software house can be both rewarding and challenging. One of the biggest challenges I faced was shifting from the traditional Waterfall model to a more flexible approach using Agile, Scrum, and Kanban. My team and I were tasked with building a social media platform for book lovers—a project that required close collaboration, timely iterations, and a clear workflow. This is a reflection of how we managed the process, the obstacles we faced, and the lessons learned.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ffq5nz8s2elim57dajgc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ffq5nz8s2elim57dajgc7.png" alt="My Team" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Waterfall Challenge
&lt;/h2&gt;

&lt;p&gt;Before this project, we had always used the Waterfall methodology. In a software house, this felt like the natural choice. Waterfall gives you that sense of control, where every stage of the project is neatly planned and executed in sequence: requirements, design, development, and testing. But this approach often led to rigid timelines and miscommunication. If a change was needed during development, going back to earlier stages was cumbersome, resulting in delays and frustrations.&lt;/p&gt;

&lt;p&gt;For this project, we realized that the Waterfall approach wouldn't allow us to be flexible enough to meet evolving requirements, especially for a dynamic platform like a social media network. This realization led us to embrace Agile, combining Scrum and Kanban to create a hybrid approach tailored to our needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shift to Agile-Scrum-Kanban: A New Way of Thinking
&lt;/h2&gt;

&lt;p&gt;Transitioning to Agile wasn't as smooth as we initially hoped. Although we had the right tools—Scrum for organizing sprints and Kanban for managing tasks—the team struggled with one significant challenge: shaking off the habits formed from years of Waterfall projects. Developers found themselves waiting for the design to be finalized before starting, and the workflow often felt like we were reverting to the Waterfall model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adapting to Challenges
&lt;/h2&gt;

&lt;p&gt;While we haven’t fully found the perfect solution, one of the approaches we are considering is to embrace cross-functional teams. Having designers, developers, and even stakeholders work together from the very start of the sprint could help reduce delays caused by waiting on one another. In our current approach, we had scenarios where the back-end developer would start working on the business logic, the designer would begin creating high-fidelity designs in Figma based on wireframes, and the front-end developer would start creating the front-end skeleton.&lt;/p&gt;

&lt;p&gt;Although it felt like we were following an Agile approach, this setup often mirrored the Waterfall process, where one team member had to wait for another to complete their work. For example, the front-end developer would wait for the final design to be implemented, resulting in unnecessary delays. This sequential dependency made it challenging to move at the speed of Agile promises.&lt;/p&gt;

&lt;p&gt;To counter this, we’re working towards more parallel processing within sprints. Breaking tasks into smaller, independent chunks that don’t rely on sequential completion would allow developers and designers to work simultaneously. This shift would significantly reduce bottlenecks and make our sprints smoother.&lt;/p&gt;

&lt;p&gt;Additionally, we’ve started focusing on more robust sprint reviews and retrospectives to highlight these bottlenecks in real-time, enabling us to quickly adapt and evolve our workflow. In the future, shorter iterations and more real-time feedback are essential to prevent falling back into Waterfall-like habits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Outcome: A Successful Sprint
&lt;/h2&gt;

&lt;p&gt;Despite the challenges, the outcome of the project was extremely positive. By using the Agile-Scrum-Kanban mix, we were able to build the necessary features without any major conflicts during the sprints. The key to this success was the clear communication and alignment we had during the backlog discussions. Everyone knew exactly what needed to be done and what the priorities were, allowing us to complete each sprint without confusion or scope creep.&lt;/p&gt;

&lt;p&gt;The platform for book lovers came together smoothly, with each function being developed and tested in clear iterations. We were able to deliver value consistently, meeting the expectations of both the stakeholders and the end-users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Switching from Waterfall to a hybrid Agile approach wasn’t easy, but it was a necessary step for us to evolve as a team. While we’re still fine-tuning our process, the Agile-Scrum-Kanban framework has proven to be more flexible and efficient for our projects. If you’re considering making the switch, my advice is to involve your whole team from the start, allow for flexibility, and don’t be afraid to iterate on your process just like you do on your product.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>scrum</category>
      <category>agile</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Story From WordPress to Leadership: A Software Engineer's Journey</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Sat, 20 Jul 2024 14:24:03 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/a-story-from-wordpress-to-leadership-a-software-engineers-journey-h3</link>
      <guid>https://forem.com/msulaimanmisri/a-story-from-wordpress-to-leadership-a-software-engineers-journey-h3</guid>
      <description>&lt;p&gt;In the dynamic world of software development, career paths often take unexpected turns. This is the story of a passionate programmer whose journey led him from specialized web development to a leadership role, and ultimately back to his coding roots—albeit in a different company and with newfound wisdom.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Early Days: Mastering WordPress
&lt;/h2&gt;

&lt;p&gt;Our story begins with a dedicated WordPress developer, crafting digital experiences with a blend of creativity and technical skill. Each day brought new challenges in theme development, plugin customization, and creating responsive designs. The world of content management systems was his playground, and he excelled in it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Broadening Horizons: The Software Engineer.
&lt;/h2&gt;

&lt;p&gt;Recognizing his potential, the company soon promoted him to the role of Software Engineer. This transition marked a significant step in his career, broadening his horizons beyond WordPress to tackle a diverse array of general software development tasks.&lt;/p&gt;

&lt;p&gt;The excitement of exploring different technologies and solving varied challenges fueled his passion for coding. From backend systems to front-end frameworks, our protagonist immersed himself in the vast ocean of software development, continuously learning and growing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Unexpected Promotion: Lead Developer
&lt;/h2&gt;

&lt;p&gt;Just as he was hitting his stride in this new role, another opportunity presented itself. The company offered him a promotion to Lead Developer—a position that promised not only a substantial salary increase but also the chance to shape the direction of projects and mentor junior team members.&lt;/p&gt;

&lt;p&gt;Initially hesitant, our developer was swayed by the company's predicament. There was no one else to fill the crucial role of overseeing developer workflows and managing projects. With a mix of trepidation and a sense of duty, he accepted the position, believing he could balance his passion for programming with his new responsibilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality of Leadership
&lt;/h2&gt;

&lt;p&gt;What followed was a stark awakening to the realities of leadership in the tech industry. The once-comfortable world of coding gave way to a landscape dominated by meetings, stakeholder management, and business strategy. Our lead developer found himself spending a mere 20% of his time on actual coding—and even that was primarily for research purposes rather than project work.&lt;/p&gt;

&lt;p&gt;The daily routine became a source of emotional turmoil. Sitting with his team, listening to discussions about cutting-edge technologies and the rhythmic clicking of keyboards, stirred a profound sense of longing. Each line of code typed by his team members felt like a reminder of the path he had reluctantly left behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Struggle for Balance
&lt;/h2&gt;

&lt;p&gt;Concerned about his growing dissatisfaction, our protagonist approached senior management, hoping for a solution. However, the response was disheartening. The company lacked qualified internal candidates to take over the lead developer role, leaving him firmly entrenched in his new position.&lt;/p&gt;

&lt;p&gt;As the months turned into years, our lead developer gained valuable insights into the business side of software development. He broadened his perspective and acquired new skills. Yet, these professional gains came at a significant personal cost. The joy he once found in programming had dimmed, replaced by the constant pressure of managerial responsibilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Decision to Move On
&lt;/h2&gt;

&lt;p&gt;After two years in the lead developer role, our protagonist realized that his true passion lay in hands-on coding. The experience had been invaluable, providing insights into project management, team dynamics, and business operations. However, it had also made clear that his career goals were firmly rooted in technical excellence rather than people management.&lt;/p&gt;

&lt;p&gt;With a heavy heart but a clear vision for his future, he decided it was time to move on. He was grateful for the trust the company had placed in him and the opportunities they had provided. Their support played a crucial role in his professional growth, offering lessons and experiences that would continue to influence his career.&lt;/p&gt;

&lt;h2&gt;
  
  
  A New Chapter: Return to Coding
&lt;/h2&gt;

&lt;p&gt;Armed with a wealth of experience and a renewed sense of purpose, our protagonist embarked on a job search. He faced challenges along the way, discovering that his extended time away from hands-on coding had dulled some of his technical skills. Several companies were hesitant to hire an external lead developer, preferring to promote from within.&lt;/p&gt;

&lt;p&gt;However, persistence paid off. He found a new role as a Senior Full-Stack Engineer at a different company. In this position, he made it clear from the outset that he wanted to focus on technical work, avoiding management responsibilities except for mentoring junior developers through code reviews.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;This journey, though challenging, yielded valuable insights:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Leadership roles, while prestigious, demand a genuine interest in management and business strategy. It's crucial to align career moves with personal passions and long-term goals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The title and compensation of a lead developer may be alluring, but they come with significant responsibilities that can fundamentally alter one's day-to-day work and career trajectory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintaining technical skills is crucial, even in management roles, to keep career options open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It's essential to regularly reassess career goals and have the courage to make changes when necessary.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Today, our protagonist has found his way back to his true calling. As a Senior Full-Stack Engineer in his new company, he's rediscovered the joy of solving complex technical problems and staying at the forefront of software development.&lt;/p&gt;

&lt;p&gt;His experience serves as a poignant reminder of the importance of self-awareness in career planning. It underscores the value of aligning professional roles with personal passions and the courage to course-correct when necessary.&lt;/p&gt;

&lt;p&gt;For those standing at similar career crossroads, remember: the most fulfilling path is often the one that resonates with your core interests and allows you to leverage your strongest skills. In the dynamic world of software development, there's always room for growth—but it should be growth on your own terms.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>php</category>
      <category>softwareengineering</category>
      <category>management</category>
    </item>
    <item>
      <title>Create a re-useable Mailing Code in Laravel</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Sat, 06 Apr 2024 17:54:28 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/create-a-re-useable-mailing-code-in-laravel-3bd4</link>
      <guid>https://forem.com/msulaimanmisri/create-a-re-useable-mailing-code-in-laravel-3bd4</guid>
      <description>&lt;p&gt;Hi there! In today's posting, I would like to share with you guys how to create a &lt;code&gt;Laravel Mailing&lt;/code&gt; reusable code.&lt;/p&gt;

&lt;p&gt;What I mean here is not the &lt;code&gt;php artisan make:mail&lt;/code&gt;. But the &lt;code&gt;Mail::to&lt;/code&gt; Syntax.&lt;/p&gt;

&lt;p&gt;I'm building one mechanism in my application to send the reminder email to all of our targeted users. There are two ways to send to them. One is done manually (by clicking a button and then sending the email), second is done automatically (by using Laravel Scheduler)&lt;/p&gt;

&lt;p&gt;The problem I faced was a lot of &lt;code&gt;Mail::to&lt;/code&gt; syntax logic that I needed to code. The full code is like this,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mail::to($user-&amp;gt;email)
-&amp;gt;send(new SendFirstReminder($user-&amp;gt;name, $user-&amp;gt;email));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It took me nearly 20 seconds to code it (I'm a slow typer)!&lt;/p&gt;

&lt;p&gt;And there are a few places where I need to put the code. Such as Controller, and Console.&lt;/p&gt;

&lt;p&gt;That's when I started to think. &lt;code&gt;what if I need to use that mail code again&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;So I need to spend another 20 seconds again? Of course, I don't want to do that again.&lt;/p&gt;

&lt;p&gt;So what happened is, that I created a custom &lt;code&gt;Services Class&lt;/code&gt;. I named it as &lt;code&gt;EmailReminder&lt;/code&gt;. In this class where I gather all the reminder emails. Everything is in one place.&lt;/p&gt;

&lt;p&gt;Then I use the &lt;code&gt;static method&lt;/code&gt; to make it more readable.&lt;/p&gt;

&lt;p&gt;As you can see in this image, after I created the &lt;code&gt;EmailReminder&lt;/code&gt; services, I can call it wherever I want without spending 20 seconds to code it. It can be reused in all places.&lt;/p&gt;

&lt;p&gt;I just need to call it statically and then it will work like usual. But it is shortened and more readable (at least from my point of view)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fqgqo130j08g0eoqwxjtk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqgqo130j08g0eoqwxjtk.png" alt="sulaiman-mail-code" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later I will create another post on how I created a reusable Local Scope logic for my application.&lt;/p&gt;

&lt;p&gt;If you have other suggestions, comment below. I'd love to hear about your code strategy.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
    </item>
    <item>
      <title>Inverse of hasManyThrough Laravel</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Wed, 01 Feb 2023 07:26:38 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/inverse-of-hasmanythrough-laravel-48ed</link>
      <guid>https://forem.com/msulaimanmisri/inverse-of-hasmanythrough-laravel-48ed</guid>
      <description>&lt;p&gt;Currently, I'm developing a Learning Management System called &lt;a href="https://kelasdesign.my/" rel="noopener noreferrer"&gt;Kelas Design&lt;/a&gt;. And today my task is to count how many Episodes do the Series have and vice-versa.&lt;/p&gt;

&lt;p&gt;So I do the logic using Laravel Built-in Eloquent : Has Many Though. What's my logic look like is :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3y9yo8batmlvkgeq33zm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3y9yo8batmlvkgeq33zm.png" alt="Image description" width="800" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I will get the Episodes data through Section. That's fine. But how about getting the Episode and which Series it's belongs to?&lt;/p&gt;

&lt;p&gt;I realized that, in Laravel documentation, there's no instruction about Inverse of Has Many Through or Has One Through.&lt;/p&gt;

&lt;p&gt;And since they don't provide that instruction, so I do need to create it manually. Usually if I faced a situation like this, I always reverse engineer the logic.&lt;/p&gt;

&lt;p&gt;For example, Laravel has the built-in function such as Has Many Through &amp;amp; Has One Through.&lt;/p&gt;

&lt;p&gt;So what I do is in Episode Model, I create method and returning Has One Through.  If you're thinking about using belongsTo, you are wrong.&lt;/p&gt;

&lt;p&gt;And this is my logic :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fubip6zeqe8yj8ibh3fq4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fubip6zeqe8yj8ibh3fq4.png" alt="Image description" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default, you can just passed two (2) arguements if you are following Laravel convention. But in my case, If you just passed the two arguements, it will print an Error. Which the system cannot find the column you wanted.&lt;/p&gt;

&lt;p&gt;With the extra arguements, you can search more depth. The third arguement is called &lt;code&gt;$first_key&lt;/code&gt; and the fourth is &lt;code&gt;$second_key&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Adding this, will allow the system to search more deep in your Database. And Eventually, will return you a data that you need. The third and fourth arguements is not nessasary an 'id'. It can be something else.&lt;/p&gt;

&lt;p&gt;That's all, I hope my solution also can solve your situation like me also. If you have a better approach to do the inverse, please do comment below :)&lt;/p&gt;

&lt;p&gt;PS : I've stumble upon one package name &lt;code&gt;staudenmeir/belongs-to-through&lt;/code&gt;. Tested it and based on what I read at the files, this package also will solve my problem. However, I do not seek something overkill like this. Look at my solution, compared to this package. Even though the syntax is much cleaner, but I still need to download the package that have many files. And that I do not want to.&lt;/p&gt;

&lt;p&gt;By the time I wrote this blog, this package has issue. Please refer to &lt;a href="https://github.com/staudenmeir/belongs-to-through/issues/75" rel="noopener noreferrer"&gt;Github Issue&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
    </item>
    <item>
      <title>[BM] Bagaimana untuk menikmati kenaikkan gaji bagi seorang Web Developer</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Sun, 22 Jan 2023 06:03:57 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/bm-tips-untuk-naik-gaji-bagi-seorang-web-developer-3ob1</link>
      <guid>https://forem.com/msulaimanmisri/bm-tips-untuk-naik-gaji-bagi-seorang-web-developer-3ob1</guid>
      <description>&lt;p&gt;Assalamualaikum dan Hai semua. Seperti yang saya janjikan pada posting di Facebook, saya akan kongsikan kepada kalian bagaimana saya 'Hack' diri sendiri untuk mendapatkan kenaikan gaji setiap tahun bersama 3 syarikat yang saya bekerja.&lt;/p&gt;

&lt;p&gt;Anda boleh rujuk posting saya disini : &lt;a href="https://www.facebook.com/photo/?fbid=1613914802384682&amp;amp;set=a.120422831733894&amp;amp;notif_id=1674139551199863&amp;amp;notif_t=feedback_reaction_generic&amp;amp;ref=notif" rel="noopener noreferrer"&gt;Facebook Sulaiman&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Penafian : Hasil (Result) mungkin berbeza. Kena faham sangat konsep REZEKI. Ini adalah ikhtiar sahaja. Yang menentukan segala-galanya adalah yang maha Esa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Berbalik pada tajuk yang dikarang, bagaimana anda boleh menerima kenaikkan gaji setiap tahun sebagai seorang Web Developer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Web Developer yang dimaksudkan dalam posting ini termasuklah App Developer, Software Engineer, Data Scientist, dan yang melibatkan Coding.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Apa yang saya kongsikan ini adalah semata-mata berdasarkan pengalaman saya. Dengan tips ini, saya menerima kenaikkan gaji dari 2 syarikat dan 1 syarikat lagi saya tak naik gaji tetapi mendapat skop kerja yang lebih terperinci.&lt;/p&gt;

&lt;p&gt;2 syarikat yang saya menerima kenaikkan gaji ini pula, syarikat pertama saya menerima kenaikkan 12%. Manakala syarikat kedua saya menerima dua kali kenaikkan gaji dengan kadar 28% dan 43%.&lt;/p&gt;




&lt;h3&gt;
  
  
  Kenapa anda perlu buat perkara ini?
&lt;/h3&gt;

&lt;p&gt;Pertama adalah kerana Manager, Higher management syarikat anda tidak tahu apa yang anda inginkan dalam kerjaya. Terkadang apa yang anda buat pun mereka tak ingat.&lt;/p&gt;

&lt;p&gt;Yang mereka ingat adalah anda boleh buat atau tidak. Itu saja.&lt;/p&gt;

&lt;p&gt;Dan kita sebagai pekerja, tidak boleh salahkan mereka kerana mereka sudah ada banyak tugasan mereka sendiri.&lt;/p&gt;

&lt;p&gt;Kedua, anda bertanggungjawab sepenuhnya tentang kerjaya anda. Bukan orang lain.&lt;/p&gt;

&lt;p&gt;Ketiga, syarikat perlukan sebab-musabab kenapa perlu menaikkan gaji anda. Jadi anda perlu tunjukkan Value (nilai) yang ada pada diri anda.&lt;/p&gt;




&lt;p&gt;Apa yang anda perlu laksanakan untuk membolehkan anda menerima kenaikkan gaji?&lt;/p&gt;

&lt;h3&gt;
  
  
  Pertama. Matlamat
&lt;/h3&gt;

&lt;p&gt;Anda perlu tetapkan matlamat yang jelas dalam hala tuju kerjaya anda. Anda kena jelas apa yang anda nak capai. Jika anda nak jadi CTO atau gaji RM100K / bulan, bila anda nak perkara tu terjadi?&lt;/p&gt;

&lt;p&gt;Kemudian, anda pecahkan kepada perkara yang kecil apa yang anda perlu buat demi mencapai matlamat yang utama itu tadi.&lt;/p&gt;

&lt;p&gt;Sebagai contoh, saya mahu menjadi seorang CTO (Chief Technology Officer) dengan gaji sebanyak RM30K sebulan pada tahun 2030. Untuk menjadi seorang CTO, saya mesti kena faham perkara yang berkait dengan Teknologi. Jadi setiap tahun, saya kena fokus apa yang saya nak belajar, faham dan amalkan.&lt;/p&gt;

&lt;p&gt;Sekarang saya berada di tahun 2023, jadi pada tahun ini apa yang saya perlu lakukan. Tahun hadapan apa? 2 tahun hadapan? Dan seterusnya.&lt;/p&gt;

&lt;p&gt;Untuk memudahkan anda menentukan matlamat ni, anda boleh Google apa itu Vision Board.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fcdbw75uwmw15rauoy7p1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fcdbw75uwmw15rauoy7p1.png" alt="Image description" width="692" height="692"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Kedua. Bertindak.
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Perbezaan antara orang yang gagal dan orang yang berjaya adalah, orang berjaya dia bertindak selepas dia buat perancangan.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jadi anda perlu bertindak selepas anda melaksanakan Langkah pertama. Anda tahu untuk menjadi seorang Senior Front-end Developer, anda wajib untuk tahu salah satu Libraries/Frameworks JS diluar sana. Maka anda terus bertindak dengan belajar atau buat projek yang akan mendekatkan diri anda dekat matlamat yang hendak dicapai.&lt;/p&gt;

&lt;p&gt;** Projek disini boleh jadi projek bersama syarikat atau projek tepi. Jika saya, saya akan buat projeck tepi yang ada kaitan dengan syarikat. Pada langkah ke-empat saya akan perincikan.&lt;/p&gt;

&lt;p&gt;Langkah ini wajib selaras dengan langkah pertama. Kena align.&lt;/p&gt;




&lt;h3&gt;
  
  
  Ketiga. Track &amp;amp; Record
&lt;/h3&gt;

&lt;p&gt;Selepas anda bersungguh-sungguh untuk laksanakan langkah kedua, anda wajib Track &amp;amp; Record supaya anda tahu anda tidak lari dari landasan yang anda telah bina.&lt;/p&gt;

&lt;p&gt;Gunakan platform yang boleh anda track &amp;amp; record. Contohnya saya ingin menjadi seorang WordPress Specialist. Jadi saya perlu mahir dalam JavaScript, PHP &amp;amp; SQL (Kerana dengan tiga ini, saya boleh buat pelbagai perkara dengan WordPress).&lt;/p&gt;

&lt;p&gt;Jadi saya track &amp;amp; record segala Customization, Plugins, Themes yang telah saya buat.&lt;/p&gt;




&lt;h3&gt;
  
  
  Keempat. Show. Don't tell.
&lt;/h3&gt;

&lt;p&gt;Ini adalah masanya untuk anda buktikan bahawasanya, anda adalah asset kepada syarikat. Anda ada value yang boleh membantu syarikat menjana kekayaan.&lt;/p&gt;

&lt;p&gt;Dalam ketiga-tiga syarikat yang saya sertai. Saya adalah orang pertama yang melaksanakan perkara ini. Saya ada manager, saya ada director. Saya tempah masa mereka 1 - 2 bulan awal untuk mereka luangkan masa untuk saya bentangkan Track &amp;amp; Record saya.&lt;/p&gt;

&lt;p&gt;Setiap tahun saya akan book pada hujung Disember kerana pada waktu ini kerana pada saya, ini masa yang sesuai sebelum masuk ke tahun baru. Dan sinonim dengan Masuk tahun baru dengan Azam yang baru.&lt;/p&gt;

&lt;p&gt;Pada sesi ini, anda wajib untuk bentangkan segala data yang anda buat semasa langkah ketiga yakni Track &amp;amp; Record.&lt;/p&gt;

&lt;p&gt;Anda kena kongsikan data yang berjaya dan yang tidak berjaya. Anda kena buat satu Presentation dan bincangan secara terperinci apa yang telah anda laksanakan sepanjang 12 bulan anda bekerja.&lt;/p&gt;




&lt;h3&gt;
  
  
  Kelima. Kongsikan matlamat
&lt;/h3&gt;

&lt;p&gt;Pada langkah ke-empat, anda jangan hanya sekadar beritahu tentang Track &amp;amp; Record anda. Tetapi yang paling penting, anda kena kongsi matlamat kerjaya anda.&lt;/p&gt;

&lt;p&gt;Dari sini anda boleh tahu adakah Syarikat boleh berikan peluang untuk anda mencapai matlamat yang anda inginkan. Jika syarikat tidak boleh untuk menawarkan peluang untuk anda capai matlamat kerjaya. Tidak mengapa. Mungkin syarikat lain boleh.&lt;/p&gt;

&lt;p&gt;Anda tak perlu kongsi Matlamat utama anda Seperti nak jadi CTO. tapi kongsi yang kecil sahaja. Sebagai contoh, Saya nak mahir dalam beberapa perkara pada tahun hadapan seperti API, Server, Cloud Storage dan lain-lain.&lt;/p&gt;




&lt;p&gt;Nah.. Inilah perkara yang saya laksanakan dari dahulu sehingga sekarang. Setiap tahun. Apa yang saya belajar daripada semua ini adalah, syarikat nak lihat Nilai yang ada pada diri anda. Adakah Nilai itu berbaloi untuk mereka naikkan gaji anda? Atau naikkan pangkat anda?&lt;/p&gt;

&lt;p&gt;Saya lihat ramai rakan-rakan Developer saya sekadar kerja. Sekadar harapkan gaji hujung bulan. Kalau tak cukup, mengeluh. Tapi apa tindakan pun tak diambil untuk memperbaiki hidup.&lt;/p&gt;

&lt;p&gt;Saya pun dulu begitu. Selesa dengan tugasan. Tidak mahu keluar dari ruang selesa. Tidak mahu buat perkara baru seperti Coding untuk Front-end (sebab saya fokus ke Back-end). Tapi kalau bercerita tentang gaji, sibuk kata tak cukup.&lt;/p&gt;

&lt;p&gt;Saya harap langkah ini anda dapat laksanakan demi mencapai apa yang anda inginkan dalam kerjaya. Nak jadi seorang Senior Developer pun, ada perjalannya (path). Apatah lagi nak capai Gaji RM30K sebulan. Tak gitu.&lt;/p&gt;

&lt;p&gt;Saya kongsikan Google Slide yang saya buat semasa perbentangan saya dengan Syarikat saya bekerja sekarang.&lt;/p&gt;

&lt;p&gt;** Saya buang nama syarikat, gambar syarikat dan nama klien.&lt;/p&gt;

&lt;p&gt;Slide 1. Result - Kenaikkan gaji 28% : &lt;br&gt;
&lt;a href="https://docs.google.com/presentation/d/1Y5RltFFqBWQYVSIzHmmTOgtQ59smbmQ_/edit?usp=sharing&amp;amp;ouid=107472174074672390160&amp;amp;rtpof=true&amp;amp;sd=true" rel="noopener noreferrer"&gt;Google Slide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Slide 2. Result - Kenaikkan gaji 43% : &lt;br&gt;
&lt;a href="https://docs.google.com/presentation/d/1Gdb91nH-o1QqvgKtANDTn6eOcUXPxe3T/edit?usp=sharing&amp;amp;ouid=107472174074672390160&amp;amp;rtpof=true&amp;amp;sd=true" rel="noopener noreferrer"&gt;Google Slide&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Saya harap guideline ini bermanfaaat kepada rakan-rakan developer.&lt;/p&gt;

&lt;p&gt;Sekiranya anda ada persoalan, bolehlah bertanya dibawah. Saya akan sedaya updaya untuk menjawab soalan anda.&lt;/p&gt;

&lt;p&gt;Terima kasih kerana sudi membaca.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>salary</category>
    </item>
    <item>
      <title>How to enable user to upload profile photo in Laravel 8</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Tue, 11 Jan 2022 16:01:55 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/how-to-enable-user-to-upload-profile-photo-in-laravel-8-52k3</link>
      <guid>https://forem.com/msulaimanmisri/how-to-enable-user-to-upload-profile-photo-in-laravel-8-52k3</guid>
      <description>&lt;p&gt;Today I was assigned to develop a user profile function in our client web apps.&lt;/p&gt;

&lt;p&gt;Ok, easy enough. I just need a form that has enctype and file upload.&lt;/p&gt;

&lt;p&gt;So I thought it only needs to upload the image, then store it in DB and then show it to the front-end.&lt;/p&gt;

&lt;p&gt;However, the flow that I thought is wrong. The flow should be very seamless. Which is when the user success registers, they can see the default profile image (set by the system, like example image). Then when users click on the image, their windows appear, choose the image and then save.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F63thmuk5pbnle1rsvrf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F63thmuk5pbnle1rsvrf9.png" alt="UIX-User-Profile" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The save button should not like the default file upload (refer to Bootstrap File Input).&lt;/p&gt;

&lt;p&gt;Also, after the user click Save Photo, the system will behave like SPA. Without refreshing the browser.&lt;/p&gt;

&lt;p&gt;That time I know I was in trouble. Because I don't like much play around with JavaScript. I know I can achieve that using vanilla or JS Framework such as Inertia or Vue. I'm using Laravel by the way.&lt;/p&gt;

&lt;p&gt;So after searching, I decide to use Laravel Livewire. Why?&lt;/p&gt;

&lt;p&gt;This is mainly because I think I can make it using Livewire and not others.  And the best part of Livewire is that even though I code dynamic function for Front-end, but I'm coding it using PHP Laravel. I don't know if this makes any sense to you.&lt;/p&gt;

&lt;p&gt;So how do I develop it using Livewire?&lt;/p&gt;

&lt;p&gt;First, after I create the component, I create a method named avatar() on User Class.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9gqzqyzzy9x513ipvh8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9gqzqyzzy9x513ipvh8e.png" alt="Avatar-method-syntax" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second, in the livewire component, I use the file upload trait (because Livewire does not support file upload by default).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F8naq9up5g86f3i8ciey2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F8naq9up5g86f3i8ciey2.png" alt="livewire-trait-syntax" width="800" height="921"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then I create a method to save the avatar when the user uploaded it. Don't forget to set the avatar null to remove the button right after user successfully upload the image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fddlo7pvutae41qvvavpp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fddlo7pvutae41qvvavpp.png" alt="Save-method-syntax" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Third, in my rendering component file, I show the default image first. Then after the user saves, the image will change into a new image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fkdqzcl65x4xh9w0ple3n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fkdqzcl65x4xh9w0ple3n.png" alt="Livewire-rendering-component-syntax" width="800" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it. With all of these steps, you now will have a User profile functionality.&lt;/p&gt;

&lt;p&gt;I've complete the task. Now your turn to do it better than me. Share your experience in the comment section ;)&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>livewire</category>
    </item>
    <item>
      <title>Wrap up my web development story in 2021.</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Sun, 26 Dec 2021 16:05:05 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/warp-up-my-development-story-in-2021-22bh</link>
      <guid>https://forem.com/msulaimanmisri/warp-up-my-development-story-in-2021-22bh</guid>
      <description>&lt;p&gt;That evening is the worst day of my life as a WordPress Developer.&lt;/p&gt;

&lt;p&gt;I've been appointed to develop one website, which for me is very dynamic. It's not a normal website. It is like combination of CMS, E-Commerce, CRM, and more. It's not my level. I know that I can't do it perfectly like what the client wants.&lt;/p&gt;

&lt;p&gt;Long story short, yes. I can't deliver that project as the client wanted. I'm very disappointed in myself. Very.&lt;/p&gt;

&lt;p&gt;PS: ** Maybe some of you already thinking "why you do when you already think you can't do?"&lt;/p&gt;

&lt;p&gt;Trust me. I did do everything to say I can't do it. But there's something that I don't want to mention. Because I want to focus on the other side. **&lt;/p&gt;

&lt;p&gt;At that time I was very lost. This is the very first WordPress project that I can't deliver in a good shape. Throughout my experience as WordPress Developer. This is the first time.&lt;/p&gt;

&lt;p&gt;Three (3) days I'm depressed. I have no confidence in myself. I want to quit from Web Development field.&lt;/p&gt;

&lt;p&gt;But somewhere in my mind says I can't quit. This is something that I loved to do. Coding. Solve people problems through my coding. I need to take what failed as a stepping stone to go further.&lt;/p&gt;

&lt;p&gt;At that time I realize that I don't want to make 2021 worst like my 2020.&lt;/p&gt;

&lt;p&gt;So I decided to change my life.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting Point
&lt;/h2&gt;

&lt;p&gt;1 January 2021 is the starting point. I remember that morning, around 9 AM, I'm calling my mom. Asking her permission, her blessing for me not to quit what I've planned.&lt;/p&gt;

&lt;p&gt;What I've planned is to be a good Developer. I want to master WordPress development and Laravel Development.&lt;/p&gt;

&lt;p&gt;But first, I need to start with something. After a few hours making mindmap, I finally decided to start at where should I start.&lt;/p&gt;

&lt;p&gt;Where do I start? Of course from the very beginning. Even though I already know about PHP, I start to learn it from basic. Yes. From Zero.&lt;/p&gt;

&lt;p&gt;So that I can refresh what I've forgotten in PHP.&lt;/p&gt;

&lt;p&gt;Since WordPress and Laravel are built from PHP, so PHP is the place to start.&lt;/p&gt;

&lt;p&gt;Not only PHP but also PHP OOP, PDO, MVC, API, MySQL, Bootstrap, JavaScript, WordPress Development and Laravel.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Commitment
&lt;/h2&gt;

&lt;p&gt;I give 100% of my commitment to learning all of these. Every day I pushed myself to learn at least 5 hours after working hours. Usually, I start at 9 PM. My working hours end at 6 PM. Monday to Sunday. No rest until I've finished what I started.&lt;/p&gt;

&lt;p&gt;For your information, I've implemented the 100 days of code method. Which is I need to code for 100 days. No rest. Even though people code like for 30 minutes for 1 day. But me 5 Hours!&lt;/p&gt;

&lt;p&gt;I'm very serious to change my life.&lt;/p&gt;

&lt;p&gt;After I finished the 100 days of code, I've continue the journey. This time is JavaScript. Learn from zero even though there is something that I already know.&lt;/p&gt;

&lt;p&gt;Learn until I understand how to work with JavaScript Frameworks such as VueJS or InertiaJS or Alpine. Before this, I just learn JavaScript with minimal knowledge and use jQuery for the rest.&lt;/p&gt;

&lt;p&gt;I love Alpine Js by the way. It's easy to understand and easy to implement at the small scale projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;For the result of my 200 days of code, I've created 3 WordPress plugins, 2 WordPress themes that are very dynamic and customizable to be used for my next client.&lt;/p&gt;

&lt;p&gt;Also, I develop a few medium-level Laravel projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Truth
&lt;/h2&gt;

&lt;p&gt;Is it hard for all of these?&lt;/p&gt;

&lt;p&gt;Yes. It is very hard. Especially to discipline ourselves to commit to what we have planned.&lt;/p&gt;

&lt;p&gt;Think back, 200 days is not something easy to achieve. I was very struggling to commit even 1 hour to learn in my first 10 days.&lt;/p&gt;

&lt;p&gt;I almost quit because of exhausted from working in the morning, then need to learn at night.&lt;/p&gt;

&lt;p&gt;But I always said that I won't be the man that I've used to be in 2020. So that's is my tonic to keep alive at night.&lt;/p&gt;

&lt;p&gt;To be honest, the hardest time is when you just want to start. You just need to start somewhere. Up until now, I still continue to learn. Tomorrow, until the last breath. I will learn something new related to web development.&lt;/p&gt;

&lt;p&gt;To be honest, I am proud of myself for all of these achievements for this year.&lt;/p&gt;

&lt;p&gt;Right now, most of the functions requested by the client, I can do it. Yes, there will be a little struggle. But I can manage it. Not like back in 2020.&lt;/p&gt;

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

&lt;p&gt;Every job has its own challenges. For web development, if you have a blockage, the best way to solve it is to take your time to learn or think back on the basics that you know.&lt;/p&gt;

&lt;p&gt;Think about the algorithm, the logic. If you have blockage using some technologies, try to read the documentation. That's work for me. Every single time.&lt;/p&gt;

&lt;p&gt;Thank you for your time.&lt;/p&gt;

&lt;p&gt;PS: 2022, Focus on Laravel Development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjwg7lafw8d9d55oc46yi.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjwg7lafw8d9d55oc46yi.PNG" alt="_Example of my learning schedule_" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of my learning schedule&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>beginners</category>
      <category>javascript</category>
      <category>laravel</category>
    </item>
    <item>
      <title>This is what I've experienced in Web/Software Development for more than 6 years.</title>
      <dc:creator>Muhamad Sulaiman</dc:creator>
      <pubDate>Fri, 03 Dec 2021 16:21:41 +0000</pubDate>
      <link>https://forem.com/msulaimanmisri/this-is-what-ive-experienced-in-websoftware-development-for-more-than-6-years-4468</link>
      <guid>https://forem.com/msulaimanmisri/this-is-what-ive-experienced-in-websoftware-development-for-more-than-6-years-4468</guid>
      <description>&lt;p&gt;I remember the first time I got a job as a web developer. At that time I'm still studying at my University. I work part-time in a small media agency in Sarawak, Malaysia.&lt;/p&gt;

&lt;p&gt;My reason for working part-time at that time was to study how web developers do the work in real life. I don't want to know based on a textbook or from my lecturers.&lt;/p&gt;

&lt;p&gt;After I graduated I got a job in one organization, which is in the IT Department along with 2 fresh graduates. Just like me. Who doesn't have much experience in developing internal systems.&lt;/p&gt;

&lt;p&gt;I get lucky because I have 1 year of working as a part-time web developer. So I share what I know with other developers what I know.&lt;/p&gt;

&lt;p&gt;Fast forward, I moved to a few organizations and web/software houses. And this is what I get. &lt;/p&gt;

&lt;p&gt;For those who just want or enter the web/software development house, these are my pros and cons. Hope this will help you to choose which one you want to choose to start. Organization or web/software house.&lt;/p&gt;

&lt;p&gt;This may be not applicable to you. This is 100% based on my experience. &lt;/p&gt;

&lt;p&gt;Oh by the way, when I mention organization, that's is Internal Team. And I also will shorten the web/software house into a software house.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pro's work in Organization
&lt;/h2&gt;

&lt;p&gt;1.&lt;strong&gt;&lt;u&gt; No need to focus or master many programming languages&lt;/u&gt;&lt;/strong&gt;. If you are a back-end developer, probably you just need to know, master and use one programming language. Once you start coding the internal system, that language gonna stay for the next 5 - 10 years, maybe.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;More Focus&lt;/u&gt;&lt;/strong&gt;. That is because you just have one system to develop. Even though the functionality will expand, but only in that system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Better Communication&lt;/u&gt;&lt;/strong&gt;. You will have direct communication with the users. For example, an internal system will be used by other departments within the organization. So if they want to request new features, they just can gather the team.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Con's
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Request from users can be changed out-of-blue&lt;/u&gt;&lt;/strong&gt;. Sometimes, your higher management people will say A today, and next week they will say B. And you need to follow that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Pressure from other departments&lt;/u&gt;&lt;/strong&gt;. Some people, don't know that as a developers, we need to do some research before getting our hands dirty. They will ask you when the new features gonna completed. You need to learn how to work under pressure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Salary is not offered much&lt;/u&gt;&lt;/strong&gt;. Each organization that I joined. The salary that they offered is lower than another offer that I got. However, this is your choice. I've my own reason why I still accept to work in an organization at that time.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;&lt;code&gt;Update 2024 : I now working as a Senior Full Stack Engineer at the Product House @ In-house team. I've got a way better salary from the Software House. When I wrote this post before this, the salary was little compared to now. I think the company value plays a crucial role in determining your salary&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Okay so let's look at Software House.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Pro's
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;You really &lt;strong&gt;&lt;u&gt;can learn and experience much&lt;/u&gt;&lt;/strong&gt; by developing many web/software.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are a lot of senior developers that can help you. Even for a small company that I've joined, they do have experience developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Higher salary.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Con's
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;For a small software house, &lt;strong&gt;&lt;u&gt;you need to know 2 or 3 programming languages (at least know the basics), and sometimes you need to learn new languages.&lt;/u&gt;&lt;/strong&gt;. Because some clients want you to develop the system using a specific programming language or Framework.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because they are willing to invest handsomely, your company might not reject that and appoint you or your team to do. So prepare yourself.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Need to handle more than one project&lt;/u&gt;&lt;/strong&gt;. Because of a software house, the sales team will always find customers. So there's a possibility that you will handle more than one project. So you need to prepare with Management Skills.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Faced the Project Manager or Lead Developer who doesn't know the tech world&lt;/u&gt;&lt;/strong&gt;. Yes, on my side I've once faced PMs who don't know the Tech world. Lead Developer who doesn't know how to code. But work in a software house. So it is difficult to say no. Here, you need to learn how to communicate effectively.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's a lot I want to share, but I think these are enough to make you an entry-level or fresh graduate to choose. Is it an organization or software house to be chosen as your first experience in the real-live environment as a web @ software developer.&lt;/p&gt;

&lt;p&gt;Thank you for reading :)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
