<?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: ASTOMO PANCORO PUTRO</title>
    <description>The latest articles on DEV Community by ASTOMO PANCORO PUTRO (@hibiscusht).</description>
    <link>https://dev.to/hibiscusht</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3341208%2F16874eda-cdfa-4dc6-8e61-b1db0fd0196c.jpeg</url>
      <title>DEV Community: ASTOMO PANCORO PUTRO</title>
      <link>https://dev.to/hibiscusht</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hibiscusht"/>
    <language>en</language>
    <item>
      <title>Kalau Merasa Framework itu Mahal, Silakan Bikin Dependency Injection Sendiri</title>
      <dc:creator>ASTOMO PANCORO PUTRO</dc:creator>
      <pubDate>Wed, 22 Jul 2026 08:30:40 +0000</pubDate>
      <link>https://dev.to/hibiscusht/kalau-merasa-framework-itu-mahal-silakan-bikin-dependency-injection-sendiri-26de</link>
      <guid>https://dev.to/hibiscusht/kalau-merasa-framework-itu-mahal-silakan-bikin-dependency-injection-sendiri-26de</guid>
      <description>&lt;p&gt;Semenjak berkembang banyak framework di berbagai bahasa pemrograman, membuat suatu project menjadi lebih mudah. Sebab di dalam framework tersebut, fitur dependency injection dan modular digunakan secara masif. Apa yang sebenarnya terjadi?&lt;/p&gt;

&lt;h2&gt;
  
  
  Pola Desain Inti Semua Framework
&lt;/h2&gt;

&lt;p&gt;Semua framework menerapkan pola desain inti (&lt;em&gt;design pattern&lt;/em&gt;) yang fokus pada &lt;em&gt;separation of concern&lt;/em&gt; (pemisahan perhatian). Arti nya, seluruh framework ini dipecah menjadi banyak komponen yang masing-masing nya dapat berjalan secara independen namun secara berangsur membentuk tujuan akhir yang sama (modularitas). Dengan prinsip modularitas ini, seorang programmer bisa lebih leluasa menentukan mau pakai modul yang mana untuk mengembangkan fitur yang dibutuhkan dalam business workflow yang sedang dikerjakannya.&lt;/p&gt;

&lt;p&gt;Pengembang framework kemudian memanfaatkan fitur dalam bahasa pemrograman yang digunakan untuk framework tersebut salah satu nya adalah &lt;strong&gt;dependency injection&lt;/strong&gt;. Omon-omon, di awal tadi dibilang "komponen yang berjalan secara independen" kok tiba-tiba ada istilah "dependency injection", kan makna nya bertolak belakang? Gasskeun penjelasan selanjutnya...&lt;/p&gt;

&lt;h2&gt;
  
  
  Suntikan Ketergantungan: Apa Ini Sebenarnya?
&lt;/h2&gt;

&lt;p&gt;Dependency injection itu makna nya suatu prosedur (bisa function, method, class, dsb) yang dipanggil dari prosedur lain ketika prosedurnya itu dibutuhkan seketika. Saat prosedur utama dijalankan, masing-masing &lt;em&gt;injected dependency&lt;/em&gt; itu "muter" sendiri, artinya memproses sesuai aturannya masing-masing. Namun hasil akhirnya tetap dikendalikan oleh prosedur utama. Jadi sebenarnya, yang &lt;em&gt;dependent&lt;/em&gt; alias bergantung itu adalah prosedur utama nya. Sedangkan modul yang disuntikan itu &lt;em&gt;independent&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Kalau yang pernah belajar "jeroan" pemrograman, pasti pernah dengar istilah &lt;em&gt;sub routine&lt;/em&gt;. Nah, modul adalah sub routine yang berada di file terpisah. Dalam konsep modularitas, suatu sub routine bisa memiliki sub routine lagi. Sehingga terjadilah hirarki modul. Tiap sub routine ini memiliki logika nya sendiri-sendiri. Namun mereka memproses suatu potongan data yang akan dikumpulkan dan digunakan oleh prosedur utama.&lt;/p&gt;

&lt;p&gt;Contoh singkat, misalnya ada suatu prosedur hendak memecah route &lt;/p&gt;

&lt;p&gt;&lt;code&gt;GET /api/v1/students/{id}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nah di situ prosedur perlu sub routine antara lain&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;HTTP method filter&lt;/li&gt;
&lt;li&gt;HTTP URI analyser&lt;/li&gt;
&lt;li&gt;Controller matcher&lt;/li&gt;
&lt;li&gt;Query builder&lt;/li&gt;
&lt;li&gt;Response builder&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Setiap sub routine itu juga mungkin butuh sub routine lain misalnya&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Regular Expression matcher&lt;/li&gt;
&lt;li&gt;Route config matcher&lt;/li&gt;
&lt;li&gt;Error handler&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Setiap sub routine ini akan berproses secara mandiri dan hasil nya akan disuntikkan ke prosedur utama secara hirarkis. Nah sekarang jelas kan gambaran dari dependency injection?&lt;/p&gt;

&lt;h2&gt;
  
  
  Cara Memanfaatkan Dependency Injection
&lt;/h2&gt;

&lt;p&gt;Nah berikut ini ada contoh sederhana dependency injection untuk bahasa pemrograman php dan typescript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Request {
    public body = {
        id: 1,
        name: "Astomo typescript"
    }
}

class MyNewInjected {

    public injector(request: Request) {
        const name = request.body.name
        return name
    }

}

function testInjector() {
    const my_inject = new MyNewInjected
    const request = new Request
    const inject_data = my_inject.injector(request)
    console.log(`hello, ${inject_data}`)
}

testInjector()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk contoh dependency injection pada typescript ini, class &lt;code&gt;MyNewInjected&lt;/code&gt; ini berisi method &lt;code&gt;injector&lt;/code&gt; yang membutuhkan argument &lt;code&gt;request&lt;/code&gt; dengan tipe data &lt;code&gt;Request&lt;/code&gt;. Tipe data Request ini merupakan suatu class &lt;code&gt;Request&lt;/code&gt; yang memiliki property &lt;code&gt;body&lt;/code&gt; yang berupa object dengan property id dan name. Nah cara memanggil tipe data Request ini lah yang disebut menyuntikkan dependency. Class Request bisa diletakkan di file lain untuk kemudian diimport ke dalam file tempat class MyNewInjected berada. Bisa juga dibuat lebih fleksibel dengan menambahkan interface ke class Request.&lt;/p&gt;

&lt;p&gt;Selanjutnya semua class dipanggil ke dalam function &lt;code&gt;testinjector&lt;/code&gt; yang berperan sebagai routine utama. Dalam framework real, routine utama nya berada di library node_modules, jadi tidak terlihat. Yang terlihat hanyalah class MyNewInjected yang biasanya berupa controller.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
class Request {

public $body = [

             "id"=&amp;gt;"1",
         "name"=&amp;gt;"Astomo P"

        ];

}

class MyClass {

public function getData(Request $req) {
    $name = $req-&amp;gt;body["name"];
    return "hello, " . $name;
}

}

$request = new Request();
$my_class = new MyClass();
echo json_encode($my_class-&amp;gt;getData($request),true);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk contoh dependency injection pada php ini, class &lt;code&gt;MyClass&lt;/code&gt; ini berisi method &lt;code&gt;getData&lt;/code&gt; yang memerlukan argument &lt;code&gt;$request&lt;/code&gt; dengan type hint &lt;code&gt;Request&lt;/code&gt;. Type hint Request ini merupakan suatu class &lt;code&gt;Request&lt;/code&gt; dengan property &lt;code&gt;$body&lt;/code&gt; yang berisi array dengan key id dan name. Kalau di php cara memanggil dependency injection ialah melalui type hint seperti ini. Class Request ini bisa diletakkan di file terpisah untuk diimport ke dalam file di mana class MyClass berada. &lt;/p&gt;

&lt;p&gt;Selanjutnya semua class di running ke dalam file routine utama. Di real framework, file routine utama ini berada di library vendor, jadi tidak terlihat. Yang terlihat hanyalah class MyClass yang biasanya berupa controller.&lt;/p&gt;

&lt;p&gt;Kalau kedua kode ini di running hasil nya sbb:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0und7jsugxbnopw16w0m.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0und7jsugxbnopw16w0m.png" alt="Gambar hasil dependency injection" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Perkembangan framework dalam berbagai bahasa pemrograman sangat memudahkan pengembangan project. Apalagi framework modern sudah menerapkan design pattern yang memanfaatkan modularitas dan dependency injection dengan masif. Meskipun demikian modul-modul tersebut diletakkan dalam library yang diinstall dari direktori repository publik seperti node_modules dan vendor. Jika framework modern dirasa mahal, silakan membuat dependency injection sendiri. &lt;/p&gt;

</description>
      <category>dependencyinjection</category>
      <category>php</category>
      <category>node</category>
    </item>
    <item>
      <title>ABCDE nya DevOps itu Begini...</title>
      <dc:creator>ASTOMO PANCORO PUTRO</dc:creator>
      <pubDate>Thu, 30 Apr 2026 02:28:24 +0000</pubDate>
      <link>https://dev.to/hibiscusht/abcde-nya-devops-itu-begini-51i5</link>
      <guid>https://dev.to/hibiscusht/abcde-nya-devops-itu-begini-51i5</guid>
      <description>&lt;p&gt;Dalam dunia pengembangan perangkat lunak, budaya DevOps semakin menjadi hal yang tak dapat dikesampingkan. Namun banyak organisasi yang hanya bermodalkan semangat mencoba menerapkan budaya DevOps sebab pengetahuannya minim dan justru fokus pada automation. Padahal, inti dari budaya DevOps itu hanyalah sederhana saja.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A: Agile - Lincah&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lincah itu dimaknai sebagai kemampuan organisasi untuk merespon perubahan dengan cepat. Namun bukan berarti perubahan business flow di luar kontrak yang disepakati. Lalu apa dong? Perubahan yang direspon dengan cepat adalah perubahan yang memiliki &lt;em&gt;business value&lt;/em&gt; tinggi bagi klien. Business value ini artinya, perubahan fitur tersebut bisa menggenjot revenue bagi klien. Di sini, lincah bermakna memberikan challenge kepada klien: mengutamakan fitur yang mendesak, penting, dan business value tinggi supaya timeline project tetap sesuai kontrak yang disepakati - dengan kata lain klien harus memprioritisasi ulang fitur yang sudah disepakati.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B: Blameless - Tidak mencari kesalahan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dalam organisasi, permasalahan teknis bisa timbul kapan saja. Dengan budaya DevOps masalah itu dihadapi bersama sebagai tim, bukan menunjuk siapa yang salah. Seringkali dalam organisasi masih tertinggal budaya feodal masalah senioritas. Bukan dalam hal pengalaman, namun masa kerja. "Gue lebih lama di sini masa nurut-nurut aja sama orang baru". Sehingga ide-ide segar seringkali diabaikan. Padahal dalam ide tersebut ada paparan permasalahan yang bisa jadi kendala di kemudian hari. Dalam budaya feodal, tentu harus cari kambing hitam alih-alih melihat akar permasalahan (root cause analysis) dan memikirkan bersama solusinya. Dengan budaya DevOps, permasalahan dipandang sebagai tantangan bersama untuk dicarikan solusinya dan menjadi pembelajaran di masa yang akan datang.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C: Collaboration - Kerjasama&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kerjasama dalam budaya DevOps itu makna nya luas. Tidak sekedar mengerjakan suatu hal bersama-sama, namun juga lintas platform. Dalam satu project tidak mungkin satu orang dev mengerjakan semuanya sendirian, apalagi jika menghadapi suatu tool atau runtime yang tidak dia kuasai. Hal semacam ini bukan sesuatu yang memalukan. Dengan budaya DevOps, kerjasama dengan personal yang memiliki kecakapan dalam bidang lain justru wajib. Misalnya ada project web app berbasis Node.js, namun memerlukan suatu tool berbasis python atau golang. Meng-hire personal yang bisa mengerjakan tool tersebut lebih menguntungkan ketimbang mencoba sendiri oleh personal yang tidak punya skill di situ. Justru jika memaksa mencoba sendiri tanpa skill malah akan menghabiskan waktu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;D: Decentralised - Berbagi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Salah satu manfaat menerapkan budaya DevOps adalah memecah kebuntuan antara developer dan operation. Namun budaya DevOps juga menekankan pentingnya berbagi. Pekerjaan tidak harus dikerjakan sendiri, namun dipecah-pecah menjadi module yang bisa dikerjakan banyak orang. Kebutuhan teknologi (tech stack) juga wajib dibagikan informasi nya ke seluruh tim supaya ditemukan solusi final dan permanen. Seperti soal deployment apakah memakai containerisasi atau hanya transfer file lalu mensetup runtime di server sasaran. Kemudian perlu nya ada stage dan production server. Dan sebagainya. Semua hal tersebut perlu dipikirkan bersama antara developer dan operation. Tidak ada yang namanya terima jadi dalam budaya DevOps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;E: Empathy - Perduli&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Perduli bermakna menyediakan solusi untuk menghadapi kendala bersama. Perduli ini lebih kearah investasi ketimbang ide. Investasi bukan berarti harus menyediakan device gahar, namun menciptakan sistem dan kondisi yang bersifat inklusif. Misalnya, tidak mewajibkan tim untuk menggunakan laptop dengan spesifikasi atau OS tertentu (BYOD/Bring Your Own Device). Solusinya bisa dengan menyewa layangan hosting murah untuk membikin sistem self hosted yang terintegrasi untuk proses development, testing, dan deployment. Perduli dalam bentuk lain bisa juga dengan tidak menambah overtime dengan alasan extra effort karena habis cuti. Cuti (leave) adalah hak setiap personal tim. Pekerjaan yang dipending sementara seharusnya diprioritisasi ulang sehingga bagian yang belum dikerjakan adalah bagian yang tidak mengganggu keseluruhan business flow. Misalnya pekerjaan menambah layer 2FA pada login, jika ada permintaan verifikasi via email dan via whatsapp maka setelah salah satu dikerjakan maka metode verifikasi lain bisa dipending dan dikerjakan di hari-hari selanjutnya. Sebab multi metode untuk verifikasi itu bersifat redundant dan tidak mendesak jika salah satu saja sudah bisa digunakan. Namun tidak berarti redundancy ini diabaikan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Budaya DevOps memecahkan kebuntuan antara development dan operation. Inti dari budaya DevOps adalah kerjasama dan perduli, sehingga setiap permasalah yang dihadapi dipandang sebagai tantangan bersama yang perlu dicarikan solusinya. Solusi dalam budaya DevOps selalu bersifat inklusif dan memberikan keuntungan bersama.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>culture</category>
      <category>softwaredevelopment</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Waktu nya Males Belajar Tech Stack (Baru)</title>
      <dc:creator>ASTOMO PANCORO PUTRO</dc:creator>
      <pubDate>Sat, 06 Sep 2025 08:34:42 +0000</pubDate>
      <link>https://dev.to/hibiscusht/waktu-nya-males-belajar-tech-stack-baru-3dg1</link>
      <guid>https://dev.to/hibiscusht/waktu-nya-males-belajar-tech-stack-baru-3dg1</guid>
      <description>&lt;p&gt;Perkembangan model pembuatan aplikasi semakin meriah akhir-akhir ini. Hanya dalam hitungan bulan, beragam tech stack baru bermunculan -- dengan akronim nya masing-masing. Tech stack menggabungkan berbagai lini dalam pembuatan aplikasi -- mulai dari bahasa pemrograman, sistem deployment, sampai manajemen data. Di tengah membanjirnya tech stack baru timbul skeptisme: perlukah para dev yang sudah berkecimpung di suatu tech stack untuk segera beradaptasi dengan tech stack baru? Benarkah alasan bahwa bertahan pada suatu tech stack akan tertinggal kemajuan? Baca sampai selesai beberapa fakta menarik berikut ini!&lt;/p&gt;

&lt;h2&gt;
  
  
  Fun Fact #1: Client tidak perduli dengan tech stack yang digunakan pada aplikasi yang dibutuhkannya
&lt;/h2&gt;

&lt;p&gt;Fakta menarik ini cukup mencengangkan bukan? Pada dasarnya client mengabaikan detil teknis aplikasi yang dibutuhkannya. Mereka menurut saja, namun memiliki &lt;em&gt;emphasis&lt;/em&gt; (penekanan). Untuk client di bidang keuangan, emphasis pada keamanan dan kecepatan. Untuk client di bidang commerce, emphasis pada kemampuan handling request massal secara real time. Client bidang lain emphasis pada &lt;em&gt;total cost of ownership&lt;/em&gt; yang terjangkau. Sebuah quote menarik untuk disimak:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;there is no technology fits all client needs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tim development yang baik harus memerhatikan emphasis ini. Pemilihan tech stack tinggal menyesuaikan emphasis dan tentu saja ketersediaan budget. Jangan sampai terjadi over budget malah mendapatkan tech stack yang tidak memenuhi target emphasis. Atau sebaliknya, budget mepet dipaksa memakai tech stack terkini dengan fitur yang sebenarnya di luar emphasis client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fun Fact #2: Jumlah penduduk bumi sekitar 8 milyar dan semua nya butuh makan
&lt;/h2&gt;

&lt;p&gt;Mungkin fakta menarik ini menimbulkan pertanyaan: "apakah saya harus ikut memikirkan kebutuhan makan semua penduduk bumi?". Dalam kaitan dengan perkembangan tech stack, jika kita perhatikan alasan terkuat seseorang berusaha menguasai segala macam tech stack adalah takut tidak kebagian job yang menggunakan tech stack yang belum dikuasainya. Pada dasarnya alasan ini bisa dibilang mengada-ada. Betul, ada sebagian software house yang menentukan tech stack terlalu dini, bahkan sebelum mengetahui real kebutuhan client dan merekrut dev baru. Namun hal tersebut tetap saja tidak dapat dijadikan landasan agar setiap dev mengantisipasi segala kemungkinan.&lt;/p&gt;

&lt;p&gt;Seandainya dalam kondisi tertentu tim dev terpaksa memakai lebih dari 1 macam tech stack, maka sikap bijaksana yang dapat diambil adalah dengan collab -- memecah project sesuai dengan tech stack yang dikuasai anggota tim dev. &lt;/p&gt;

&lt;p&gt;Dalam setiap keputusan tim dev selalu ada &lt;em&gt;trade off&lt;/em&gt; (harga):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;jika memaksa dev untuk bekerja dengan tech stack yang tidak dikuasai maka akan memperlambat proses development karena dev lebih banyak beradaptasi ketimbang mengembangkan fitur yang dibutuhkan client&lt;/li&gt;
&lt;li&gt;jika merekrut dev serba bisa maka akan menurunkan performa dev ybs sebab fokus nya bercabang cabang&lt;/li&gt;
&lt;li&gt;jika melakukan collab untuk menyesuaikan skill dev terhadap tech stack yang digunakan maka akan menambah biaya pembuatan aplikasi&lt;/li&gt;
&lt;li&gt;jika melibatkan AI maka selain ada penambahan biaya untuk sewa AI -- yang hanya berguna saat development -- maka timeline akan makin panjang khususnya untuk melakukan code check yang dihasilkan AI guna memastikan kesesuaian dengan fitur yang dibutuhkan client&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dari trade off tersebut, yang paling bijaksana dan realistis tetaplah melakukan collab. Tentu saja, poin terpenting dari collab adalah memberikan kesempatan bagi dev baru untuk meraih pendapatan yang diharapkan dapat membantu mengurangi pengangguran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fun Fact #3: Project yang dikerjakan oleh banyak dev cenderung lebih stabil
&lt;/h2&gt;

&lt;p&gt;Fakta menarik ini tak kalah mencengangkan bukan? Mungkin banyak yang merasa heran -- khusus nya para dev serba bisa dan single fighter -- kok bisa?&lt;/p&gt;

&lt;p&gt;Tentu saja! Sebab project yang dikerjakan oleh banyak dev itu memiliki bagian-bagian yang terpisah. Jika satu bagian mengalami crash, bagian lain tetap normal. Dengan begitu test juga bisa dilakukan bertahap, bagian per bagian. Tak hanya itu, deployment pun bisa dilakukan bertahap pula, bagian per bagian. Selain itu semakin banyak dev yang terlibat, semakin banyak pula kepala yang ikut memikirkan solusi atas permasalahan, bug fixing, serta patch. Dengan sendirinya, project tersebut semakin stabil per rilis. Quite simple!&lt;/p&gt;

&lt;p&gt;Berkaca dari project-project open source besar, terlihat bahwa project tersebut memiliki sekian ratus contributor yang bekerja di bagian yang berbeda-beda. Hal ini terlihat dari antrian pull request di repo project tsb. Dan hasilnya bisa kita lihat, project tersebut bisa rilis stable version secara rutin.&lt;/p&gt;

&lt;p&gt;Namun dibalik luar biasanya para contributor, ada skeptisme: apa yang terjadi jika ada dev yang tiba-tiba meninggalkan bagian nya yang belum selesai? bukankah akan menimbulkan banyak legacy code? Nah, di sini lah clean code mengambil peran. Project open source maupun open contribute wajib menerapkan clean code termasuk coding style standar. Hal ini akan memudahkan handover task antar dev tanpa perlu transfer of knowledge lagi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fun Fact #4: Tech stack hopping bisa merugikan diri sendiri dan tim
&lt;/h2&gt;

&lt;p&gt;Inilah fakta menarik yang paling mencengangkan! &lt;em&gt;Tech stack hopping&lt;/em&gt; makna nya adalah berpindah-pindah tech stack sebelum benar-benar menguasainya. Alasannya sederhana saja: harus sesegera mungkin beradaptasi dengan tech stack baru supaya memiliki kesempatan untuk mendapat job.&lt;/p&gt;

&lt;p&gt;Jika kita melihat ke linkedin atau github, mungkin sering ada yang mengisikan informasi tech stack yang sudah dikuasai. Ada yang mengaku bisa lebih dari 3 bahasa pemrograman, ada yang mengaku bisa lebih dari 3 framework, ada yang mengaku bisa lebih dari 3 deployment system, dst. Namun ketika interview banyak yang failed sebab fitur-fitur dari tech stack yang disyaratkan dalam suatu project ternyata alpa dikuasai pelamar. Parahnya, ada tim rekrutmen yang tetap menerima pelamar meski minim penguasaan nya terhadap tech stack yang disyaratkan.&lt;/p&gt;

&lt;p&gt;Kenapa terjadi ada pelamar yang portfolio nya wow namun aslinya penguasaan nya minim? Ya itu tadi, tech stack hopping. Akibatnya mereka cenderung hanya melatih skillnya pada fitur-fitur standar. Katakan ada backend framework baru maka para tech stack hopper hanya melatih pada CRUD namun meninggalkan coding standard, fitur-fitur penting bahasa basis nya, middleware, dst. Dalih nya fitur tadi bisa dipelajari sambil jalan.&lt;/p&gt;

&lt;p&gt;Kerugian tim yang diisi tech stack hopper jelas: project berjalan tersendat-sendat sebab ada fitur-fitur dasar yang dibutuhkan namun tidak dikuasai secara mendalam oleh dev nya, misalnya integrasi oAuth dengan backend framework atau integrasi payment gateway dengan frontend framework. Sedangkan kerugian di sisi tech stack hopper, jam produktif nya tersita untuk mendalami tech stack yang digunakan. &lt;/p&gt;

&lt;p&gt;Atas dasar inilah penting bagi seorang dev untuk tidak buru-buru memelajari tech stack baru sebelum benar-benar menguasai tech stack lama. Meskipun ujung-ujung nya terlihat stuck pada 1 atau 2 tech stack namun dia bisa bekerja lebih optimal berkat penguasaan nya yang mendalam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Hal yang bisa kita tarik dari beberapa fun fact di atas ada pada quote yang bermakna tidak ada teknologi bisa memenuhi segala kebutuhan client. Suka tidak suka akan ada saat nya tim dev memakai lebih dari 1 macam teknologi. Dan mau tidak mau harus melakukan collab dengan banyak dev yang skill nya beragam. Dev yang baik bukan yang mengantisipasi perkembangan teknologi namun yang siap bekerjasama untuk membuat aplikasi yang bekerja sebagaimana seharusnya.&lt;/p&gt;

</description>
      <category>hopper</category>
      <category>tech</category>
    </item>
    <item>
      <title>Hilirisasi Fiber di PHP dapat Membuka 19 juta Lapangan Lambo</title>
      <dc:creator>ASTOMO PANCORO PUTRO</dc:creator>
      <pubDate>Thu, 14 Aug 2025 09:58:08 +0000</pubDate>
      <link>https://dev.to/hibiscusht/hilirisasi-fiber-di-php-dapat-membuka-19-juta-lapangan-lambo-44p7</link>
      <guid>https://dev.to/hibiscusht/hilirisasi-fiber-di-php-dapat-membuka-19-juta-lapangan-lambo-44p7</guid>
      <description>&lt;p&gt;Bahasa pemrograman PHP terkenal melakukan proses yang bersifat &lt;em&gt;blocking&lt;/em&gt;, yakni sumber daya tidak dapat dipakai untuk keperluan lain sampai proses selesai. Namun di versi 8.* ada peningkatan fitur yang memungkinkan developer untuk menghentikan proses dan menjalankannya kembali kapan saja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mengenal Fiber
&lt;/h2&gt;

&lt;p&gt;Fiber merupakan suatu class di PHP yang berguna untuk menjalankan proses yang dapat dihentikan (suspend) dan dijalankan kembali (resume) kapan saja sesuai kebutuhan. Konsep Fiber ini mirip dengan async di Javascript namun dengan perbedaan, proses di dalam Fiber secara default hanya bisa resume satu kali saja. Berikut ini cara mendefinisikan Fiber.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

$timer = new Fiber(function($argument){
    $value = Fiber::suspend("your message");
    echo $value;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Di dalam instance Fiber ada sebuah callback yang dapat menerima argumen. Di dalam callback, ada pemanggilan method static &lt;code&gt;suspend()&lt;/code&gt; yang akan langsung menghentikan proses dan mengembalikan pesan di argumen method ini.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mengontrol Fiber
&lt;/h2&gt;

&lt;p&gt;Untuk memulai Fiber caranya sbb.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

$response = $timer-&amp;gt;start("message");
echo $response;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Method &lt;code&gt;start()&lt;/code&gt; akan memulai Fiber dalam kondisi berhenti (suspended), memasukkan nilai argumen nya sebagai argumen callback Fiber, dan menangkap nilai dari argumen method &lt;code&gt;suspend()&lt;/code&gt;. Untuk menjalankan kembali Fiber cara nya sbb.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

while(!$timer-&amp;gt;isTerminated()){
    $timer-&amp;gt;resume("message");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Di sini digunakan infinity loop while yang akan berhenti saat kondisi Fiber mati (terminated) sambil memanggil method &lt;code&gt;resume()&lt;/code&gt;. Argumen method ini akan dikembalikan oleh method &lt;code&gt;suspend()&lt;/code&gt; dan bisa ditampilkan setiap iterasi selama Fiber belum mati. Secara umum proses Fiber dapat dilihat pada flow chart berikut.&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%2Fln3o8f57osq83c4zqg3o.jpg" 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%2Fln3o8f57osq83c4zqg3o.jpg" alt="Diagram alir proses Fiber di PHP" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
Gbr 1. Diagram alir proses Fiber di PHP&lt;/p&gt;

&lt;h2&gt;
  
  
  Contoh Koding Fiber dan Penjelasan nya
&lt;/h2&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%2F3w5trnr5dz3qji4n1319.jpg" 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%2F3w5trnr5dz3qji4n1319.jpg" alt="Contoh koding Fiber" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Gbr 2. Contoh koding Fiber&lt;/p&gt;

&lt;p&gt;Pada gambar di atas bisa kita pecah menjadi 3 bagian. Bagian pertama ada definisi Fiber. Pada definisi ini terdapat sebuah loop for yang panjang nya dibatasi oleh argument callback. Di dalam loop for terdapat function &lt;code&gt;sleep()&lt;/code&gt; yang berguna untuk menunda eksekusi Fiber selama 30 detik. Selanjutnya perintah &lt;code&gt;Fiber::suspend()&lt;/code&gt; akan otomatis menghentikan Fiber saat dijalankan pertama kali. Secara default, method &lt;code&gt;suspend()&lt;/code&gt; ini akan menampilkan pesan dari argumen nya saat dijalankan pertama kali lalu akan terminate. Namun looping for bisa digunakan untuk menunda terminate selama belum mencapai akhir loop.&lt;/p&gt;

&lt;p&gt;Bagian kedua merupakan perintah untuk menjalankan Fiber pertama kali. Dalam hal ini digunakan method &lt;code&gt;start()&lt;/code&gt;. Argumen method ini akan diterima oleh callback, sementara method ini akan menerima pesan dari &lt;code&gt;Fiber::suspend()&lt;/code&gt;. Setelah pesan diterima, defaultnya Fiber akan terminate.&lt;/p&gt;

&lt;p&gt;Bagian ketiga merupakan suatu infinity loop while. Selama Fiber tidak mengirim sinyal terminate, maka status &lt;code&gt;Fiber::isTerminated&lt;/code&gt; akan false sehingga loop terus berjalan. Di dalam loop terdapat perintah &lt;code&gt;resume()&lt;/code&gt;. Argumen dari perintah ini akan diterima oleh Fiber setelah &lt;code&gt;suspend()&lt;/code&gt;. Karena itulah argumen &lt;code&gt;resume()&lt;/code&gt; hanya berisi current timestamp. Berikut ini adalah hasil akhir dari proses Fiber di PHP.&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%2Fss9knwcof0jh84bk53jl.jpg" 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%2Fss9knwcof0jh84bk53jl.jpg" alt="Hasil akhir proses Fiber di PHP yang dijalankan lewat terminal" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Gbr 3. Hasil akhir proses Fiber di PHP yang dijalankan lewat terminal&lt;/p&gt;

</description>
      <category>php</category>
      <category>fiber</category>
      <category>async</category>
    </item>
    <item>
      <title>Pakai Atribut di PHP Nggak Perlu Bayar Royalti</title>
      <dc:creator>ASTOMO PANCORO PUTRO</dc:creator>
      <pubDate>Tue, 12 Aug 2025 05:01:30 +0000</pubDate>
      <link>https://dev.to/hibiscusht/pakai-atribut-di-php-nggak-perlu-bayar-royalti-5gaf</link>
      <guid>https://dev.to/hibiscusht/pakai-atribut-di-php-nggak-perlu-bayar-royalti-5gaf</guid>
      <description>&lt;p&gt;Perkembangan bahasa pemrograman PHP sedemikian pesat nya. Di rilis terbaru nya versi 8.*, bahasa ini menawarkan syntax baru yang dapat digunakan untuk memproses class pada saat runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mengenal Attribute
&lt;/h2&gt;

&lt;p&gt;Attribute adalah sebuah keterangan (annotation) yang dapat diproses oleh PHP dan dapat memengaruhi class dan komponennya. Untuk menuliskan attribute syntax nya sbb:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#[NamaAttribute]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Berikut ini beberapa contoh penempatan annotation pada suatu class&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

#[ClassAttribute]
class MyClass {

#[PropertyAttribute]
private $my_property;

#[MethodAttribute]
public function myMethod()
{ 
}

private function myJob(#[ParamAttribute] $request)
{
}

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penamaan pada attribute ini mengikuti aturan &lt;strong&gt;fully qualified name&lt;/strong&gt; di PHP, yakni memerlukan namespace. Dengan sendirinya wujud attribute adalah sebuah class.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mendeklarasikan Attribute
&lt;/h2&gt;

&lt;p&gt;Untuk mendeklarasikan attribute, sama saja seperti mendeklarasikan class di PHP. Namun perlu ditambahkan annotation &lt;code&gt;#[Attribute]&lt;/code&gt;. Berikut ini contoh nya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace MyAttributes;

use Attribute;

#[Attribute]
class MethodAttribute {
public function __construct($value)
{
}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sedangkan untuk menambahkan attribute, maka annotation harus ditempatkan di bagian class yang sesuai.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

use MyAttributes\MethodAttribute;

class MyClass {
#[MethodAttribute("hello")]
public function myMethod(){
}
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Annotation bisa menerima argumen jika saat deklarasi ditambahkan konstruktor. Nantinya nilai dari argumen ini bisa dipanggil saat diproses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memproses Attribute
&lt;/h2&gt;

&lt;p&gt;PHP menyediakan built in interface bernama &lt;code&gt;Reflection&lt;/code&gt; yang bisa digunakan untuk menedeteksi annotation yang ditambahkan pada class tersebut. Interface ini terdiri dari beberapa class sesuai dengan bagian class yang hendak dimodifikasi. Class yang tersedia antara lain sbb.&lt;/p&gt;

&lt;p&gt;ReflectionClass -- untuk memproses class&lt;br&gt;
ReflectionProperty -- untuk memproses property&lt;br&gt;
ReflectionMethod -- untuk memproses method&lt;br&gt;
ReflectionParameter -- untuk memproses parameter&lt;/p&gt;

&lt;p&gt;Untuk mendeteksi annotation, tiap-tiap class tersebut memiliki method &lt;code&gt;getAttributes&lt;/code&gt; yang mengembalikan array dari semua annotation yang terdeteksi. Sebagai catatan, tiap komponen class bisa memiliki lebih dari satu annotation. Array ini terdiri atas class &lt;code&gt;ReflectionAttribute&lt;/code&gt;. Class ini juga memiliki method yang bisa digunakan untuk berinteraksi dengan annotation yang dipilih. Berikut ini contoh memproses annotation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
use MyAttribute\MethodAttribute;
use MyClass;

function processAttribute(){
  $method = new ReflectionMethod(MyClass::class,"myMethod");
  $attr = $method-&amp;gt;getAttributes(MethodAttribute::class);
  foreach($attr as $item){
    //panggil attribute yang terdeteksi di sini
    $attr_class = $item-&amp;gt;newInstance();
  }
  //panggil class di sini
  $class = new ReflectionClass(MyClass::class);
  $main_class = $class-&amp;gt;newInstance();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Contoh Kode Pemanfaatan Reflection dan Annotation
&lt;/h2&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%2Faynoflrz8lbovt38bs0y.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%2Faynoflrz8lbovt38bs0y.png" alt="Gbr 1. Deklarasi Attribute" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Gbr 1. Deklarasi Attribute&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%2F9m0axg582n4bvfehz5e1.jpg" 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%2F9m0axg582n4bvfehz5e1.jpg" alt="Gbr 2. Annotating Class" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Gbr 2. Annotating 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%2F61f0jouebh76qh5euklp.jpg" 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%2F61f0jouebh76qh5euklp.jpg" alt="Gbr 3. Parsing Attribute (gunakan require jika tidak autoloading class)" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Gbr 3. Parsing Attribute (gunakan require jika tidak autoloading 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%2F1vkhequjxiyhv2tn57ll.jpg" 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%2F1vkhequjxiyhv2tn57ll.jpg" alt="Gbr 4. Hasil akhir" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Gbr 4. Hasil akhir&lt;/p&gt;

</description>
      <category>php</category>
      <category>attributes</category>
    </item>
  </channel>
</rss>
