<?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: Alik Khilazhev</title>
    <description>The latest articles on DEV Community by Alik Khilazhev (@alikhil).</description>
    <link>https://dev.to/alikhil</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%2F247811%2F1c34568a-dc9f-422f-ac4e-c99e620b56fa.jpeg</url>
      <title>DEV Community: Alik Khilazhev</title>
      <link>https://dev.to/alikhil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alikhil"/>
    <language>en</language>
    <item>
      <title>Forward SMS to Telegram with Android</title>
      <dc:creator>Alik Khilazhev</dc:creator>
      <pubDate>Sun, 12 Jul 2026 14:32:54 +0000</pubDate>
      <link>https://dev.to/alikhil/forward-sms-to-telegram-with-android-198f</link>
      <guid>https://dev.to/alikhil/forward-sms-to-telegram-with-android-198f</guid>
      <description>&lt;p&gt;A few years ago, I wrote a &lt;a href="https://dev.to/posts/forwarding-sms-to-telegram/"&gt;post&lt;/a&gt; on how I automated SMS forwarding using second-hand 3G modems and a Gammu SMS daemon running on a Linux server.&lt;/p&gt;

&lt;p&gt;This setup worked well for a while, but then became outdated due to the instability of USB dongles and the planned deprecation of 2G and 3G networks in Europe.&lt;/p&gt;

&lt;p&gt;One day, I got tired of replugging USB modems and manually restarting containers, so I decided to look for a new solution.&lt;/p&gt;

&lt;p&gt;First, I thought I would build my own device using existing 4G modules for an ESP32 or a Raspberry Pi, but I quickly discovered it would cost me a fortune to support two or more SIM cards.&lt;/p&gt;

&lt;p&gt;Then I looked for off-the-shelf solutions. I found some cool 8/16/32+ SIM support boxes from Chinese vendors. But again, they were pricey, and I didn’t need so many SIM cards.&lt;/p&gt;

&lt;p&gt;After that letdown, I returned to the old, forgotten idea of using a dedicated Android device for my task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Device
&lt;/h2&gt;

&lt;p&gt;I didn’t have a spare Android device at home, so I looked for a second-hand working one with two SIM slots on Wallapop.&lt;/p&gt;

&lt;p&gt;I ended up buying a Moto E14 for €25.&lt;/p&gt;

&lt;p&gt;I tried to root it as soon as I received it, mostly out of curiosity and to gain better control over my device. But I was unable to find a working solution for that.&lt;/p&gt;

&lt;p&gt;So I gave up and tried to configure everything without root access.&lt;/p&gt;

&lt;p&gt;Spoiler: I succeeded. No root was needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software
&lt;/h2&gt;

&lt;p&gt;I had two SIM cards, and the current setup forwarded SMS messages to different Telegram channels.&lt;/p&gt;

&lt;p&gt;I looked for an app that would allow me to do so. I considered the &lt;a href="https://github.com/telegram-sms/telegram-sms" rel="noopener noreferrer"&gt;telegram-sms&lt;/a&gt; app, but after a quick look, it &lt;a href="https://config.telegram-sms.com/" rel="noopener noreferrer"&gt;seemed not to support&lt;/a&gt; splitting SMS messages into separate chats.&lt;/p&gt;

&lt;p&gt;In the end, I chose to go with an &lt;a href="https://github.com/bogkonstantin/android_income_sms_gateway_webhook" rel="noopener noreferrer"&gt;android_income_sms_gateway_webhook&lt;/a&gt;. It does not support Telegram specifically, but it lets you configure a webhook that can call any service, including Telegram.&lt;/p&gt;

&lt;p&gt;However, to split SMS messages from different SIM cards into separate channels, I needed to implement a webhook handler, which took Codex about five minutes.&lt;/p&gt;

&lt;p&gt;Here is a link to the GitHub repository: &lt;a href="https://github.com/alikhil/sms-forwarder-telegram-webhook" rel="noopener noreferrer"&gt;github.com/alikhil/sms-forwarder-telegram-webhook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a simple, stupid Python web server that parses the JSON and sends two JSON requests to Telegram servers for the right channel.&lt;/p&gt;

&lt;p&gt;I deployed the webhook handler in my homelab using Docker Compose, and it became the bridge between the Android app and Telegram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sms-webhook&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/alikhil/sms-forwarder-telegram-webhook.git#main&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;DEFAULT_TARGET_CHAT_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;-88005553535&lt;/span&gt;
      &lt;span class="na"&gt;SIM1_TARGET_CHAT_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;-100500&lt;/span&gt;
      &lt;span class="na"&gt;SIM2_TARGET_CHAT_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;-100500800&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt; &lt;span class="c1"&gt;# includes TELEGRAM_BOT_TOKEN&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000:8000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I configured the app to send SMS messages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&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%2F53v4cksrpt0raptdk70y.png" alt="android_income_sms_gateway_webhook app configuration" width="720" height="1612"&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That’s it. The SMS forwarding path was working end-to-end.&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%2F0p48fa3syyrc2nb7ft6d.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%2F0p48fa3syyrc2nb7ft6d.png" alt="forwarded sms notification in telegram" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring
&lt;/h2&gt;

&lt;p&gt;After the pain of previous solutions, I wanted to be notified if something failed.&lt;/p&gt;

&lt;p&gt;If I did not receive an SMS that I was expecting, I would not know that I had missed it. The app might crash, or the battery might run low.&lt;/p&gt;

&lt;p&gt;Fortunately, the SMS gateway app supports sending heartbeats.&lt;/p&gt;

&lt;p&gt;I set up a Uptime Kuma monitor and configured the app to send heartbeats every 5 minutes. Kuma expects a heartbeat every 5 hours.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&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%2Factetdt3v0072zz2ad4n.png" alt="configuring heartbeats" width="720" height="1612"&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The values were tuned empirically because the app does not strictly follow the schedule. As I understand it, this is a technical limitation of the app running in the background.&lt;/p&gt;

&lt;p&gt;But it is okay for me, even if I learn about a failure after twice the normal interval.&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%2Fsz650vgwvn255tzldmm1.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%2Fsz650vgwvn255tzldmm1.png" alt="kuma dashboard" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Power management
&lt;/h2&gt;

&lt;p&gt;I didn’t want my Android device connected to a power supply all the time because I believed the battery health would suffer as a result.&lt;/p&gt;

&lt;p&gt;Also, I didn’t want to connect and disconnect it manually every time. I’m an engineer, after all. It must be automated.&lt;/p&gt;

&lt;p&gt;I wanted it to work like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the battery level is below 20%, connect the power.&lt;/li&gt;
&lt;li&gt;If the battery level is above 90%, disconnect the power.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had a spare smart and controllable Shelly Plug that I could use for such automation.&lt;/p&gt;

&lt;p&gt;I could probably use one of the Home Assistant plugins to implement it, but I don’t use Home Assistant and didn’t want to install it just for this small use case. That would be overkill.&lt;/p&gt;

&lt;p&gt;The next step was to find Android apps that could send a webhook when the battery reached a certain level.&lt;/p&gt;

&lt;p&gt;There were surprisingly few decent apps for this. It seems like a very niche use case.&lt;/p&gt;

&lt;p&gt;The only thing I found was &lt;a href="https://github.com/hossain-khan/android-remote-notify" rel="noopener noreferrer"&gt;Android Remote Notify&lt;/a&gt;. And, of course, I couldn’t configure Shelly automation directly there.&lt;/p&gt;

&lt;p&gt;So, Codex handled &lt;a href="https://github.com/alikhil/android-remote-notify-webhook-handler" rel="noopener noreferrer"&gt;another simple webhook handler&lt;/a&gt; that calls the Shelly Plug API when the battery reaches a certain level.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;battery-webhook&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/alikhil/android-remote-notify-webhook-handler.git#main&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;SHELLY_PLUG_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://192.168.99.88&lt;/span&gt; &lt;span class="c1"&gt;# Your shelly plug IP&lt;/span&gt;
      &lt;span class="na"&gt;PORT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
      &lt;span class="na"&gt;LOW_BATTERY_THRESHOLD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
      &lt;span class="na"&gt;HIGH_BATTERY_THRESHOLD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;90&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only after I had configured and deployed everything did I realize the app had a major limitation: it did not have a way to trigger an alert when the battery level exceeded 90%. It only supported a lower-bound threshold.&lt;/p&gt;

&lt;p&gt;I didn’t want to search for another solution when I was so close to completing the current one. Luckily for me, the app was open source.&lt;/p&gt;

&lt;p&gt;I concluded that a simpler approach would be to send battery level periodically, and the webhook handler controlled the plug based on those reports.&lt;/p&gt;

&lt;p&gt;I prompted Codex in the repository to develop the new feature.&lt;/p&gt;

&lt;p&gt;After 15 minutes of hacking, it produced a solution. I didn’t have a full Android development setup, and I didn’t want to bloat my Mac with it.&lt;/p&gt;

&lt;p&gt;So I asked Codex to build the APK inside Docker. Five more minutes and it was done.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&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%2Fz86pxt4xikzlqdll5dck.png" alt="configuring periodic checks" width="720" height="1612"&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I replaced the app with the custom patched build, and it worked.&lt;/p&gt;

&lt;p&gt;I went ahead and created a &lt;a href="https://github.com/hossain-khan/android-remote-notify/pull/451" rel="noopener noreferrer"&gt;pull request to upstream&lt;/a&gt;, and it was accepted. As a nice bonus, I no longer need to maintain a fork.&lt;/p&gt;

&lt;p&gt;To be fair, heartbeats and battery-level webhooks were not coming on a strict schedule.&lt;/p&gt;

&lt;p&gt;To monitor the webhook handler, I built a page that reports things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When the last state was reported&lt;/li&gt;
&lt;li&gt;What the battery level was at that time&lt;/li&gt;
&lt;li&gt;The last command sent to Shelly.&lt;/li&gt;
&lt;li&gt;Etc.&lt;/li&gt;
&lt;/ul&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%2Flfj2m1zqi3bgnu4sbywc.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%2Flfj2m1zqi3bgnu4sbywc.png" alt="Webhook handler status" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;p&gt;During webhook testing, I encountered an issue where both Android apps struggled to send requests to an insecure HTTP endpoint.&lt;/p&gt;

&lt;p&gt;There is probably a configuration option somewhere that allows such behavior.&lt;/p&gt;

&lt;p&gt;I simply routed the traffic through my custom domain with Let’s Encrypt certificates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;It was my first time tinkering with Android, and I enjoyed it. I expected it to require more hassle.&lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

</description>
      <category>android</category>
      <category>sms</category>
      <category>telegram</category>
    </item>
    <item>
      <title>How to Quickly Prepare for Software Engineering Interviews</title>
      <dc:creator>Alik Khilazhev</dc:creator>
      <pubDate>Thu, 23 Apr 2026 22:40:38 +0000</pubDate>
      <link>https://dev.to/alikhil/how-to-quickly-prepare-for-software-engineering-interviews-2pk4</link>
      <guid>https://dev.to/alikhil/how-to-quickly-prepare-for-software-engineering-interviews-2pk4</guid>
      <description>&lt;p&gt;A few months ago, I found myself needing to prepare for a series of job interviews within a very limited timeframe. It was a stressful experience, but it ultimately worked out well. I decided to share my notes and reflections in case they’re helpful to others in a similar situation.&lt;/p&gt;

&lt;p&gt;This is especially relevant if you’re not actively job hunting and suddenly receive an interview invitation, leaving you with limited time to prepare but a strong desire to maximize your chances of success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: The tips described in this post may be more useful for senior engineers with hands-on experience and engineering intuition.&lt;/p&gt;

&lt;h2&gt;
  
  
  HR Interview
&lt;/h2&gt;

&lt;p&gt;The internet is full of articles listing all possible HR interview questions. I recommend spending a bit of time on them just to understand what to expect and not be surprised.&lt;/p&gt;

&lt;p&gt;However, in my humble opinion, there are two main points to focus on during HR interview preparation.&lt;/p&gt;

&lt;p&gt;First, you need a short story that tells your experience briefly. Avoid listing every bullet point from your CV. Instead, focus on highlighting your key achievements. Also, your story must be aligned with the position you are applying to. Yes, you might need to adjust your story for different jobs at different companies.&lt;/p&gt;

&lt;p&gt;Second, it’s important to have a clear motivation. Why do you want to change your job, and why this company/role? What kind of job are you looking for?&lt;/p&gt;

&lt;h2&gt;
  
  
  System Design
&lt;/h2&gt;

&lt;p&gt;If you have some experience doing System Design interviews or have never done it, start by learning the &lt;a href="https://www.hellointerview.com/learn/system-design/in-a-hurry/delivery" rel="noopener noreferrer"&gt;Delivery framework&lt;/a&gt;. Understand each section.&lt;/p&gt;

&lt;p&gt;Watch at &lt;a href="https://www.youtube.com/watch?v=Nfa-uUHuFHg" rel="noopener noreferrer"&gt;least one video&lt;/a&gt; on how it’s done. The more, the better. These videos from &lt;a href="https://www.youtube.com/@hello_interview" rel="noopener noreferrer"&gt;Hello Interview channel&lt;/a&gt; are really good, though.&lt;/p&gt;

&lt;p&gt;If you are applying to a FAANG company, you may search for &lt;a href="https://systemdesign.io/" rel="noopener noreferrer"&gt;leaked system design questions&lt;/a&gt; from that company and spend some time preparing for them. But there is no guarantee that you will get the same topic, thus I would not recommend spending &lt;strong&gt;all your time&lt;/strong&gt; here.&lt;/p&gt;

&lt;p&gt;If you can, do a mock interview. Ask a friend or find someone to practice with.&lt;br&gt;
If you can’t, then try to walk through alone, but talk through everything out loud.&lt;/p&gt;

&lt;p&gt;During the interview, treat the interviewer as a colleague, ask questions, ensure you understand the problem, and that you have not missed any important requirements before building the design of the system.&lt;/p&gt;

&lt;p&gt;Don’t rush.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live coding
&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%2Foy622dvjicvv0lfjet5e.jpeg" 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%2Foy622dvjicvv0lfjet5e.jpeg" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This part is really tricky. If the company tends to use LeetCode-style interviews, there is no shortcut here. You need to solve hundreds of them to really feel confident. You may need to refresh your memory on algorithms you feel less confident about (for example, I always forget about corner cases for binary search).&lt;/p&gt;

&lt;p&gt;Again, if it’s a big / well-known company, you can try to search for leaked coding interview questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Behavioral interview
&lt;/h2&gt;

&lt;p&gt;S.T.A.R (situation task action result) &amp;amp; C.A.R.L (context action result learning)&lt;/p&gt;

&lt;p&gt;There are dozens of questions you could be asked in behavioral interviews. And you’re expected to structure your answers using the STAR framework. This means you need to tell a story by defining a context, your actions, and results.  You could go and just prepare a STAR format answer to all such questions, but it will take a lot of time, and it’s suboptimal. This, combined with the fact that the same stories can be used for different questions, makes the situation easier for you. You can prepare 7–10 stories that will cover most of the questions. During preparation, you can write them as text, but don’t read them during the interview. It tends to sound unnatural.&lt;/p&gt;

&lt;p&gt;When telling your story using the STAR method, make sure your final sentence clearly highlights a positive outcome. Adjust your tone to emphasize this closing part so it stands out.&lt;/p&gt;

&lt;p&gt;The STAR framework is a standard. But also check CARL in some questions, it would be good to tell what you have learned from that story.&lt;/p&gt;

&lt;p&gt;Here are some materials that helped me to prepare for a behavioral interview:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/bBvPQZmPXwQ?si=s1ZbiomG5ouanRye" rel="noopener noreferrer"&gt;Hello Interview - Behavioral Interview Discussion with Ex-Meta Hiring Committee Member&lt;/a&gt;- must watch Behavioral interview, although I would recommend watching it even before the HR interview, because it gives a bunch of helpful tips about self-presentation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://thebehavioral.substack.com/" rel="noopener noreferrer"&gt;https://thebehavioral.substack.com/&lt;/a&gt; - Strategies, tips, and resources to prepare for your next behavioral interview from a FAANG+ insider.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project Walkthrough
&lt;/h2&gt;

&lt;p&gt;Some companies have such an interview stage. It’s quite unpopular but still exists.&lt;br&gt;
You’re asked to present a project or problem you worked on. You explain the context, problem, solution, results, and your role in this story. It’s like showing the result of your work to colleagues from different departments/teams.&lt;/p&gt;

&lt;p&gt;This stage is very open-ended. You are not given specific instructions, and there is not much information on the internet with recommendations on how to prepare and conduct such interviews.&lt;br&gt;
When I found out I would have this interview, I was initially shocked and unsure how to prepare, as I didn’t know what to expect. It wasn't until I realized that in reality, &lt;strong&gt;it’s you, the interviewee, who rules this interview&lt;/strong&gt;. You choose the project, decide what to include and omit, control the level of detail, and you are coming up with the story you know, with all the answers for all possible questions, because it’s your story.&lt;/p&gt;

&lt;p&gt;So, make the most of this stage. Prepare your story, make a few slides / notes / architecture sketches.&lt;/p&gt;

&lt;p&gt;Don’t dig into details too much. Leave a space for the questions.&lt;/p&gt;

&lt;p&gt;And even if there is no dedicated interview, you may be asked to tell in detail about a certain problem/project you were working on. So, be prepared. Have your story!&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;When answering open-ended questions, aim to &lt;strong&gt;tell stories where the scale of the problem matches the level of the role you’re applying for&lt;/strong&gt;. For example, if you are asked, “Tell me about a challenging/interesting problem/task you were working on recently.” Optimizing an SQL query by adding an index may be fine for junior roles, but it won’t carry enough weight for senior positions. Interviewers would expect to hear something bigger, challenging, higher stakes, and often involving cross-team collaboration, such as migrating a large system to Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question back&lt;/strong&gt;. You should ask questions to learn more about the company, their culture, the hiring manager’s management style, and what they like or dislike about their work. Prepare a list of questions before the interview.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start preparing in advance&lt;/strong&gt;. Even if you’re not planning to change jobs anytime soon, you can begin investing in your future by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;solving one LeetCode problem a day&lt;/li&gt;
&lt;li&gt;keeping track of tasks/projects you’ve completed, along with your achievements (many companies require this anyway for performance reviews) – this would be a foundation for your stories in behavioral and project walkthrough interviews.&lt;/li&gt;
&lt;li&gt;keeping your CV and LinkedIn up to date.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>career</category>
      <category>interview</category>
    </item>
    <item>
      <title>Kubernetes In-Place Pod Resize</title>
      <dc:creator>Alik Khilazhev</dc:creator>
      <pubDate>Mon, 29 Dec 2025 09:00:00 +0000</pubDate>
      <link>https://dev.to/alikhil/kubernetes-in-place-pod-resize-454i</link>
      <guid>https://dev.to/alikhil/kubernetes-in-place-pod-resize-454i</guid>
      <description>&lt;p&gt;About six years ago, while operating a large Java-based platform in Kubernetes, I noticed a recurring problem: our services required significantly higher CPU and memory during application startup. Heavy use of Spring Beans and AutoConfiguration forced us to set inflated resource requests and limits just to survive bootstrap, even though those resources were mostly unused afterwards.&lt;/p&gt;

&lt;p&gt;This workaround never felt right. As an engineer, I wanted a solution that reflected the actual lifecycle of an application rather than its worst moment.&lt;/p&gt;

&lt;p&gt;I opened an &lt;a href="https://github.com/kubernetes/kubernetes/issues/83111" rel="noopener noreferrer"&gt;issue&lt;/a&gt;  in the Kubernetes repository describing the problem and proposing an approach to adjust pod resources dynamically without restarts. The issue received little discussion but quietly accumulated interest over time (13 👍 emoji reaction). Every few months, an automation bot attempted to mark it as stale, and every time, I removed the label. This went on for nearly six years...&lt;/p&gt;

&lt;p&gt;Until the release of Kubernetes 1.35 where In-Place Pod Resize feature was &lt;a href="https://kubernetes.io/blog/2025/12/19/kubernetes-v1-35-in-place-pod-resize-ga/" rel="noopener noreferrer"&gt;marked as stable&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What In-Place Pod Resize Brings
&lt;/h2&gt;

&lt;p&gt;In-Place Pod Resize allows Kubernetes to update CPU and memory requests and limits without restarting pods, whenever it is safe to do so. This significantly reduces unnecessary restarts caused by resource changes, leading to fewer disruptions and more reliable workloads.&lt;/p&gt;

&lt;p&gt;For applications whose resource needs evolve over time, especially after startup, this feature provides a long-missing building block.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impact on VerticalPodAutoscaler
&lt;/h2&gt;

&lt;p&gt;The new &lt;code&gt;resizePolicy&lt;/code&gt; field is configured at the pod spec level. While it is technically possible to change pod resources manually, doing so does not scale. In practice, this feature should be driven by a workload controller.&lt;/p&gt;

&lt;p&gt;At the moment, the only controller that supports in-place pod resize is the Vertical Pod Autoscaler (VPA).&lt;/p&gt;

&lt;p&gt;There are two enhancement proposals enable this behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/kubernetes/autoscaler/tree/455d29039bf6b1eb9f784f498f28769a8698bc21/vertical-pod-autoscaler/enhancements/4016-in-place-updates-support" rel="noopener noreferrer"&gt;AEP-4016: Support for in place updates in VPA&lt;/a&gt; which introduces &lt;code&gt;InPlaceOrRecreate&lt;/code&gt; update mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler/enhancements/7862-cpu-startup-boost" rel="noopener noreferrer"&gt;AEP-7862: CPU Startup Boost&lt;/a&gt; which is about temporarily boosting pod by giving more cpu during pod startup. This is conceptually similar to the approach proposed in my original issue.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is an example of Deployment and VPA using both AEP features:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-heavy-java-app:stable&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1000m&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1024Mi&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2000m&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2048Mi&lt;/span&gt;

&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;autoscaling.k8s.io/v1"&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;VerticalPodAutoscaler&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example-vpa&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;targetRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apps/v1"&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example&lt;/span&gt;
  &lt;span class="na"&gt;updatePolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;updateMode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;InPlaceOrRecreate"&lt;/span&gt;
  &lt;span class="na"&gt;resourcePolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;containerPolicies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;app"&lt;/span&gt;
        &lt;span class="na"&gt;minAllowed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;250m"&lt;/span&gt;
          &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;512Mi"&lt;/span&gt;
        &lt;span class="na"&gt;maxAllowed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000m"&lt;/span&gt;
          &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8192Mi"&lt;/span&gt;
        &lt;span class="c1"&gt;# The CPU boosted resources can go beyond maxAllowed.&lt;/span&gt;
        &lt;span class="na"&gt;startupBoost&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Factor"&lt;/span&gt;
            &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2"&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;With such configuration pod will have doubled cpu requests and limits during startup. During the boost period no resizing will happen.&lt;/p&gt;

&lt;p&gt;Once the pod reaches the &lt;code&gt;Ready&lt;/code&gt; state, the VPA controller scales CPU down to the currently recommended value.&lt;/p&gt;

&lt;p&gt;After that, VPA continues operating normally, with the key difference that resource updates are applied in place whenever possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Does this feature fully solve the problem described above? Only partially.&lt;/p&gt;

&lt;p&gt;First, most application runtimes still impose fundamental constraints. Java and Python runtimes do not currently support resizing memory limits without a restart. This limitation exists outside of Kubernetes itself and is tracked in the OpenJDK project via &lt;a href="https://bugs.openjdk.org/browse/JDK-8359211" rel="noopener noreferrer"&gt;an open ticket&lt;/a&gt;.&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%2Fcz0qdilgn4tk1vvt6uno.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%2Fcz0qdilgn4tk1vvt6uno.png" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second, Kubernetes does not yet support decreasing memory limits, even with in-place Pod Resize enabled. This is a known limitation documented in the enhancement proposal for &lt;a href="https://github.com/kubernetes/enhancements/tree/758ea034908515a934af09d03a927b24186af04c/keps/sig-node/1287-in-place-update-pod-resources#memory-limit-decreases" rel="noopener noreferrer"&gt;memory limit decreases&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As a result, while in-place Pod Resize effectively addresses CPU-related startup spikes, memory resizing remains an open problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;In place Pod Resize gives a foundation for cool new features like StartupBoost and makes use of VPA more reliable. While important gaps remain, such as &lt;a href="https://github.com/kubernetes/kubernetes/issues/135670" rel="noopener noreferrer"&gt;memory decrease support&lt;/a&gt; and &lt;a href="https://github.com/kubernetes/kubernetes/issues/126891" rel="noopener noreferrer"&gt;scheduling race condition&lt;/a&gt;, this change represents a meaningful step forward.&lt;/p&gt;

&lt;p&gt;For workloads with distinct startup and steady-state phases, Kubernetes is finally beginning to model reality more closely.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>opensource</category>
      <category>sre</category>
    </item>
    <item>
      <title>Contributing to Open Source: Why It Matters and How to Start</title>
      <dc:creator>Alik Khilazhev</dc:creator>
      <pubDate>Thu, 18 Dec 2025 09:53:48 +0000</pubDate>
      <link>https://dev.to/alikhil/contributing-to-open-source-why-it-matters-and-how-to-start-4m4i</link>
      <guid>https://dev.to/alikhil/contributing-to-open-source-why-it-matters-and-how-to-start-4m4i</guid>
      <description>&lt;p&gt;Whether you’re curious about open source or wondering how to make a meaningful impact, this post guides you through the process. You’ll learn why contributing is important, discover the different ways to get involved, and find practical steps to take your first contribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;First of all, why should you contribute to open source?&lt;/p&gt;

&lt;h3&gt;
  
  
  Giving back
&lt;/h3&gt;

&lt;p&gt;Everyone, from freelance engineers to Big Tech companies and even governments, uses Open Source Software (OSS). Some use it less, others more, but almost everyone depends on it in one way or another. Most of us are &lt;em&gt;consumers&lt;/em&gt; of open source.&lt;/p&gt;

&lt;p&gt;Contributing to OSS means giving something back. This is especially important given the many cases of projects (e.g &lt;a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/#history-and-challenges" rel="noopener noreferrer"&gt;nginx-ingress&lt;/a&gt;, &lt;a href="https://github.com/external-secrets/external-secrets/issues/5084" rel="noopener noreferrer"&gt;external-secrets&lt;/a&gt;) being deprecated due to maintainer burnout, lack of community support, or overwhelming workloads.&lt;/p&gt;

&lt;p&gt;It is true that some OSS projects are backed by large companies and maintained by engineers who are paid to work on them. However, the half of open source projects are still maintained by individuals in their spare time for free (&lt;a href="https://www.linuxfoundation.org/blog/open-source-maintainers-what-they-need-and-how-to-support-them" rel="noopener noreferrer"&gt;source&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;In this sense, contributing to OSS can be seen as a form of digital volunteering. Some companies (&lt;a href="https://www.linkedin.com/posts/matthieublumberg_when-running-a-platform-using-open-source-activity-7382301443698892800-3St-?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAABsF7nEBwwglPayi0aSCflAk2mD2nv-HVCA" rel="noopener noreferrer"&gt;Criteo&lt;/a&gt;, &lt;a href="https://www.futurice.com/blog/year-2015-in-company-sponsored-open-sourcehttps://www.futurice.com/blog/year-2015-in-company-sponsored-open-source" rel="noopener noreferrer"&gt;Futurice&lt;/a&gt;) even offer paid volunteer time (VPTO) specifically for open-source contributions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning
&lt;/h3&gt;

&lt;p&gt;Another strong reason to contribute to open source is personal growth.&lt;/p&gt;

&lt;p&gt;Every contribution becomes a learning opportunity because it places you inside a real, production-grade codebase rather than a controlled tutorial environment. You learn how projects are structured, how architectural decisions are made, how backward compatibility is maintained, and how trade-offs are handled in practice. Often this means working with unfamiliar tools, languages, or ecosystems, which naturally expands your technical range.&lt;/p&gt;

&lt;p&gt;At the same time, open source strongly develops communication and collaboration skills. Issues and pull requests force you to articulate problems clearly, propose solutions in a way others can evaluate, and explain &lt;em&gt;why&lt;/em&gt; a particular approach makes sense. Feedback from maintainers and contributors exposes you to different perspectives and constraints, requiring you to adapt, clarify, and sometimes rethink your ideas.&lt;/p&gt;

&lt;p&gt;Because most collaboration happens asynchronously and in writing, you also improve your ability to communicate precisely and concisely. Over time, this structured, public collaboration sharpens how you discuss technical topics, handle reviews, and work effectively with distributed teams. These are the same skills required in modern engineering organizations, making open source a highly practical training ground.&lt;/p&gt;

&lt;h3&gt;
  
  
  Networking and professional reputation
&lt;/h3&gt;

&lt;p&gt;Open source contribution naturally leads to networking, even if you are not actively trying to “network.” By participating in issues, code reviews, and pull requests, you start interacting with maintainers and contributors from different companies, countries, and levels of seniority. Over time, these repeated interactions build familiarity and trust. People begin to recognize your name, your areas of expertise, and the quality of your work.&lt;/p&gt;

&lt;p&gt;Regular contributions can turn these lightweight interactions into professional relationships. Maintainers may invite you to collaborate more closely, grant you additional responsibilities, or even recommend you for roles on their teams. In many cases, job opportunities arise not from formal applications, but from someone already knowing how you work.&lt;/p&gt;

&lt;p&gt;Another important, and often underestimated, benefit of open source contribution is visibility. Most professional work is hidden behind NDAs and internal repositories, making it difficult to demonstrate your real impact. Open source work, on the other hand, is public by default. Your commits, pull requests, discussions, and design decisions are all visible and attributable to you.&lt;/p&gt;

&lt;p&gt;This public track record allows you to clearly show not only &lt;em&gt;what&lt;/em&gt; you built or improved, but also &lt;em&gt;how&lt;/em&gt; you collaborate, communicate, and respond to feedback. For recruiters and hiring managers, this is far more convincing than a list of skills on a résumé. In practice, open source contributions often function as a living portfolio and a long-term investment in your professional reputation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How?
&lt;/h2&gt;

&lt;p&gt;Now that you understand why contributing matters, let’s look at how to get started.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Natural way
&lt;/h3&gt;

&lt;p&gt;You might think that contributing to open source requires skills you do not have, a brilliant idea for a new library, or deep expertise in a specific domain. These beliefs often make OSS contribution feel unreachable.&lt;/p&gt;

&lt;p&gt;That is not the case.&lt;/p&gt;

&lt;p&gt;You do not need a revolutionary idea or special credentials. If you are an engineer who already writes code, you are capable of contributing.&lt;/p&gt;

&lt;p&gt;Here is a simple approach: the next time you are solving a problem using an open source tool and notice that it does not work as expected (a bug) or lacks a feature you need, do not immediately abandon the tool. Use your skills, and an LLM if needed, to investigate and try to fix the issue.&lt;/p&gt;

&lt;p&gt;If you succeed, open a pull request to the upstream repository. If you do not, create an issue and share your findings. That is still a contribution, and you will have learned something in the process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Good first issue
&lt;/h3&gt;

&lt;p&gt;If everything you use works perfectly and you do not notice any gaps, you can take a more deliberate approach.&lt;/p&gt;

&lt;p&gt;Make a list of projects you like, use, or want to learn more about. Browse their open issues and look for ones labeled “good first issue” or similar. Pick something that matches your current skill level and try to tackle it.&lt;/p&gt;

&lt;p&gt;If your list is short or you cannot find suitable issues, there are also curated lists of projects actively looking for contributors.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://goodfirstissue.dev/" rel="noopener noreferrer"&gt;https://goodfirstissue.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forgoodfirstissue.github.com/" rel="noopener noreferrer"&gt;https://forgoodfirstissue.github.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goodfirstissues.com/" rel="noopener noreferrer"&gt;https://goodfirstissues.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Open source is great, but keeping it that way requires people to contribute.&lt;br&gt;
It is not hard or unreachable. Anyone can do it, and the community needs more people like you.&lt;br&gt;
Start small, pick a project you love, and take your first step&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
  </channel>
</rss>
