<?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: oshi-git</title>
    <description>The latest articles on Forem by oshi-git (@oshigit).</description>
    <link>https://forem.com/oshigit</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%2F3617992%2F3e88c341-af45-4173-ad5f-06bf4cf3d891.png</url>
      <title>Forem: oshi-git</title>
      <link>https://forem.com/oshigit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/oshigit"/>
    <language>en</language>
    <item>
      <title>Solving the 'resource_func' Mystery: How I Made Ballerina's Compiler More User-Friendly</title>
      <dc:creator>oshi-git</dc:creator>
      <pubDate>Tue, 18 Nov 2025 16:04:26 +0000</pubDate>
      <link>https://forem.com/oshigit/solving-the-resourcefunc-mystery-how-i-made-ballerinas-compiler-more-user-friendly-ed3</link>
      <guid>https://forem.com/oshigit/solving-the-resourcefunc-mystery-how-i-made-ballerinas-compiler-more-user-friendly-ed3</guid>
      <description>&lt;p&gt;title: Solving the 'resource_func' Mystery: How I Made Ballerina's Compiler More User-Friendly&lt;br&gt;
published: true&lt;br&gt;
description: A deep dive into improving compiler error messages in the Ballerina programming language - from identifying the issue to implementing a production-ready fix&lt;br&gt;
tags: ballerina, opensource, compiler, developerexperience&lt;/p&gt;
&lt;h1&gt;
  
  
  Solving the 'resource_func' Mystery: How I Made Ballerina's Compiler More User-Friendly
&lt;/h1&gt;

&lt;p&gt;When developers encounter compiler errors, clear and actionable error messages can mean the difference between quick resolution and hours of frustration. This is the story of how I improved the Ballerina compiler's error messaging system to provide better developer experience.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem: A Cryptic Error Message
&lt;/h2&gt;

&lt;p&gt;While exploring the Ballerina programming language, I encountered issue &lt;a href="https://github.com/ballerina-platform/ballerina-lang/issues/43815" rel="noopener noreferrer"&gt;#43815&lt;/a&gt; in the Ballerina GitHub repository. Developers were reporting a confusing compiler error that displayed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: this resource_func must return a result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The issue? &lt;strong&gt;&lt;code&gt;resource_func&lt;/code&gt; isn't valid Ballerina syntax.&lt;/strong&gt; The correct syntax uses two separate words: &lt;code&gt;resource function&lt;/code&gt;. This seemingly minor discrepancy was causing significant confusion among developers, particularly those new to Ballerina's resource function paradigm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;In enterprise software development, developer experience (DX) is paramount. Clear error messages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce debugging time&lt;/li&gt;
&lt;li&gt;Lower the learning curve for new developers
&lt;/li&gt;
&lt;li&gt;Improve code quality by guiding developers toward correct implementations&lt;/li&gt;
&lt;li&gt;Decrease support burden on development teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a cloud-native programming language like Ballerina, which emphasizes developer productivity, this error message was undermining one of its core value propositions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Investigation: Diving Into the Compiler Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Understanding the Codebase
&lt;/h3&gt;

&lt;p&gt;The Ballerina compiler is a sophisticated multi-module system written in Java. My investigation began with systematic code navigation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identifying the error origin&lt;/strong&gt;: Located the diagnostic error code &lt;code&gt;BCE2095&lt;/code&gt; associated with this message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracing the error flow&lt;/strong&gt;: Found the error was triggered in &lt;code&gt;ReachabilityAnalyzer.java&lt;/code&gt; during semantic analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understanding the root cause&lt;/strong&gt;: Discovered the issue at line 583-584&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Root Cause
&lt;/h3&gt;

&lt;p&gt;The problematic code was deceptively simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dlog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closeBracePos&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;DiagnosticErrorCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INVOKABLE_MUST_RETURN&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;funcNode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKind&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compiler was calling &lt;code&gt;getKind().toString().toLowerCase()&lt;/code&gt; on function nodes. For resource functions, this returned the enum value &lt;code&gt;RESOURCE_FUNC&lt;/code&gt; (with underscore), which was then directly inserted into the error message template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;invokable.must.return&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;this {0} must return a result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: &lt;code&gt;"this resource_func must return a result"&lt;/code&gt; instead of &lt;code&gt;"this resource function must return a result"&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Implementing Proper Function Kind Formatting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Design Considerations
&lt;/h3&gt;

&lt;p&gt;As an enterprise-grade compiler, any modification needed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintain backward compatibility&lt;/li&gt;
&lt;li&gt;Follow established code patterns&lt;/li&gt;
&lt;li&gt;Be maintainable and extensible&lt;/li&gt;
&lt;li&gt;Not impact performance&lt;/li&gt;
&lt;li&gt;Handle all function types correctly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementation Strategy
&lt;/h3&gt;

&lt;p&gt;I implemented a helper method to properly format function kind names for user-facing error messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getFunctionKindName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BLangFunction&lt;/span&gt; &lt;span class="n"&gt;funcNode&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;funcNode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKind&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="c1"&gt;// Convert internal enum representation to user-friendly format&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"resource_func"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"resource function"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then modified the error logging call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dlog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closeBracePos&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;DiagnosticErrorCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INVOKABLE_MUST_RETURN&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;funcNode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKind&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// After  &lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dlog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closeBracePos&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;DiagnosticErrorCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INVOKABLE_MUST_RETURN&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;getFunctionKindName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;funcNode&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Approach Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Separation of concerns&lt;/strong&gt;: Internal representation (&lt;code&gt;RESOURCE_FUNC&lt;/code&gt;) remains unchanged while user-facing text is formatted appropriately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility&lt;/strong&gt;: Easy to add formatting for other function types if needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal footprint&lt;/strong&gt;: Single helper method, no changes to diagnostic infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero performance impact&lt;/strong&gt;: Simple string comparison executed only during error conditions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: Clear, self-documenting code that future contributors can easily understand&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Contribution Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical Workflow
&lt;/h3&gt;

&lt;p&gt;Contributing to a major open-source project requires following established protocols:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Forked the repository&lt;/strong&gt;: Created personal fork of &lt;code&gt;ballerina-platform/ballerina-lang&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Created feature branch&lt;/strong&gt;: &lt;code&gt;fix-issue-43815&lt;/code&gt; for isolation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Made targeted changes&lt;/strong&gt;: Modified only &lt;code&gt;ReachabilityAnalyzer.java&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Committed with proper messaging&lt;/strong&gt;: Clear commit message referencing the issue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submitted Pull Request&lt;/strong&gt;: &lt;a href="https://github.com/ballerina-platform/ballerina-lang/pull/44407" rel="noopener noreferrer"&gt;#44407&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signed CLA&lt;/strong&gt;: Completed Contributor License Agreement&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Code Review Considerations
&lt;/h3&gt;

&lt;p&gt;The PR includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal diff&lt;/strong&gt;: Only 13 lines changed, 5 removed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear intent&lt;/strong&gt;: Single responsibility - fix error message formatting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No breaking changes&lt;/strong&gt;: Backward compatible modification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No new dependencies&lt;/strong&gt;: Uses existing infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impact and Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Immediate Benefits
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: this resource_func must return a result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Developers confused by non-existent &lt;code&gt;resource_func&lt;/code&gt; syntax&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: this resource function must return a result  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Clear indication of correct syntax with two words&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Broader Implications
&lt;/h3&gt;

&lt;p&gt;This fix demonstrates several software engineering principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User-Centric Design&lt;/strong&gt;: Error messages should use language users understand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attention to Detail&lt;/strong&gt;: Small UX improvements compound over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Systematic Debugging&lt;/strong&gt;: Methodical code navigation yields results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean Implementation&lt;/strong&gt;: Simple solutions are often the best&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Technical Learnings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Compiler Architecture Insights
&lt;/h3&gt;

&lt;p&gt;Working with the Ballerina compiler provided valuable insights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Analysis Phase&lt;/strong&gt;: Error detection happens after parsing, during semantic analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnostic System&lt;/strong&gt;: Centralized error message management through property files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AST Traversal&lt;/strong&gt;: Visitor pattern used for analyzing Abstract Syntax Trees&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Reporting&lt;/strong&gt;: Separation between error detection and message formatting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practices in Large Codebases
&lt;/h3&gt;

&lt;p&gt;Contributing to enterprise software taught me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read before you write&lt;/strong&gt;: Understanding existing patterns prevents technical debt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow established conventions&lt;/strong&gt;: Consistency matters in team environments
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document your reasoning&lt;/strong&gt;: Clear commit messages and PR descriptions facilitate review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test thoroughly&lt;/strong&gt;: Even small changes need verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engage with the community&lt;/strong&gt;: Responsive communication speeds up acceptance&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Matters for Developer Experience
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Cost of Poor Error Messages
&lt;/h3&gt;

&lt;p&gt;Research shows that developers spend approximately 50% of their time debugging. Unclear error messages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increase time-to-resolution&lt;/li&gt;
&lt;li&gt;Create frustration and cognitive load&lt;/li&gt;
&lt;li&gt;May cause developers to abandon a technology&lt;/li&gt;
&lt;li&gt;Generate unnecessary support requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Value of Continuous Improvement
&lt;/h3&gt;

&lt;p&gt;Every error message improvement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saves collective developer hours&lt;/li&gt;
&lt;li&gt;Improves language adoption&lt;/li&gt;
&lt;li&gt;Demonstrates project maturity&lt;/li&gt;
&lt;li&gt;Builds community confidence&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Improving developer experience isn't always about major features or performance optimizations. Sometimes, it's about the small details - like ensuring error messages use the correct terminology.&lt;/p&gt;

&lt;p&gt;This contribution to Ballerina demonstrates that open source is accessible to developers at all levels. You don't need to implement complex algorithms or major features to make meaningful contributions. Sometimes, the most valuable improvements are the ones that reduce friction in daily development workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with good first issues&lt;/strong&gt;: They're marked as such for a reason&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand before you code&lt;/strong&gt;: Time spent reading code is time well invested&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Think about the user&lt;/strong&gt;: Every message, error, or log is communication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small PRs get merged faster&lt;/strong&gt;: Focused changes are easier to review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation matters&lt;/strong&gt;: Well-documented contributions get better reception&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Get Involved
&lt;/h2&gt;

&lt;p&gt;Interested in contributing to Ballerina? Here's how to start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Explore the codebase&lt;/strong&gt;: &lt;a href="https://github.com/ballerina-platform/ballerina-lang" rel="noopener noreferrer"&gt;github.com/ballerina-platform/ballerina-lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check good first issues&lt;/strong&gt;: Look for beginner-friendly contributions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join the community&lt;/strong&gt;: &lt;a href="https://discord.gg/ballerina" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; | &lt;a href="https://twitter.com/ballerinalang" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the docs&lt;/strong&gt;: &lt;a href="https://ballerina.io/learn/" rel="noopener noreferrer"&gt;ballerina.io/learn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every major open-source project started with someone's first contribution. This was mine - what will yours be?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;About the Author&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm a software engineering student passionate about compiler design, developer tools, and open-source contributions. This article documents my first contribution to the Ballerina programming language. Connect with me on &lt;a href="https://github.com/oshi-git" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pull Request&lt;/strong&gt;: &lt;a href="https://github.com/ballerina-platform/ballerina-lang/pull/44407" rel="noopener noreferrer"&gt;#44407 - Fix error message for resource functions&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found this helpful? Follow me for more articles on open-source contribution, compiler design, and developer tools.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Ballerina #OpenSource #CompilerDesign #DeveloperExperience #SoftwareEngineering
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Update: Code Review Journey
&lt;/h2&gt;

&lt;p&gt;After publishing this post, the Ballerina maintainers provided excellent feedback during code review. The final merged version included additional improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better code formatting and indentation&lt;/li&gt;
&lt;li&gt;More robust test cases using actual error scenarios&lt;/li&gt;
&lt;li&gt;Cleaner method structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This review process taught me the importance of code quality and responding to feedback professionally. The final PR was merged after 3 rounds of review!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ballerina-platform/ballerina-lang/pull/44407" rel="noopener noreferrer"&gt;View the merged PR here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ballerina</category>
      <category>opensource</category>
      <category>compiler</category>
      <category>devrel</category>
    </item>
  </channel>
</rss>
