<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://developer.tapsell.ir/blog</id>
    <title>Tapsell Blog</title>
    <updated>2026-06-09T10:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://developer.tapsell.ir/blog"/>
    <subtitle>Tapsell Blog</subtitle>
    <icon>https://developer.tapsell.ir/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Taproll — A Faster Ad Player for Android]]></title>
        <id>https://developer.tapsell.ir/blog/introducing-taproll</id>
        <link href="https://developer.tapsell.ir/blog/introducing-taproll"/>
        <updated>2026-06-09T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[We've introduced Taproll — an Android library for rendering VAST and VMAP video advertisements using native views. It is a drop-in alternative to Google's IMA SDK, designed to keep ads running even when internet access is unavailable.]]></summary>
        <content type="html"><![CDATA[<p>We've introduced <strong>Taproll</strong> — an Android library for rendering VAST and VMAP video advertisements using native views. It is a drop-in alternative to <a href="https://developers.google.com/interactive-media-ads">Google's IMA SDK</a>, designed to keep ads running even when internet access is unavailable.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-taproll">Why Taproll?<a href="https://developer.tapsell.ir/blog/introducing-taproll#why-taproll" class="hash-link" aria-label="Direct link to Why Taproll?" title="Direct link to Why Taproll?">​</a></h2>
<p><a href="https://developers.google.com/interactive-media-ads">Google's IMA SDK</a> is the default choice for VAST/VMAP ad playback on Android, but it has a critical weakness: it requires a persistent internet connection to fetch and render ads. During internet shutdowns — a recurring reality in Iran — IMA-based ad playback breaks entirely. Beyond that, IMA is not prepared for Iran's network conditions, offers <a href="https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/localization">no default localization for Farsi</a>, and provides limited control over the ad UI. Taproll was built to address all of these.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="works-without-internet">Works Without Internet<a href="https://developer.tapsell.ir/blog/introducing-taproll#works-without-internet" class="hash-link" aria-label="Direct link to Works Without Internet" title="Direct link to Works Without Internet">​</a></h3>
<p>Taproll does not require internet access to render ads. IMA stops working the moment connectivity is lost — Taproll keeps your ad revenue flowing regardless of network conditions.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="high-performance">High Performance<a href="https://developer.tapsell.ir/blog/introducing-taproll#high-performance" class="hash-link" aria-label="Direct link to High Performance" title="Direct link to High Performance">​</a></h3>
<p>Taproll is based on minimal features, lightweightness, minimal footprint, faster builds, and fewer version conflicts. Benchmark results show it starts up and renders the first frame of a pre-roll ad roughly <strong>1.9× faster</strong> than IMA — approximately <strong>1.4s vs 2.65s</strong> under the same conditions.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="simple-ui-control">Simple UI Control<a href="https://developer.tapsell.ir/blog/introducing-taproll#simple-ui-control" class="hash-link" aria-label="Direct link to Simple UI Control" title="Direct link to Simple UI Control">​</a></h3>
<p>Customize the ad overlay through an XML layout using <code>XmlOverlayAdapter</code>, or implement the <code>AdOverlay</code> interface for more control over the skip button, countdown timer, and header views. UI elements use standard Android widgets (<code>TextView</code> or its subclasses) rather than opaque custom views.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="low-dependency">Low Dependency<a href="https://developer.tapsell.ir/blog/introducing-taproll#low-dependency" class="hash-link" aria-label="Direct link to Low Dependency" title="Direct link to Low Dependency">​</a></h3>
<p>Taproll's only required dependency is ExoPlayer (Media3). No Google IMA SDK, no Google Play Services — just a single, lightweight library that adds minimal footprint to your build.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="active-development">Active Development<a href="https://developer.tapsell.ir/blog/introducing-taproll#active-development" class="hash-link" aria-label="Direct link to Active Development" title="Direct link to Active Development">​</a></h3>
<p>Taproll is under active development with frequent updates. Need a feature or found a bug? <a href="https://github.com/tapsellorg/Discussion/">Open a discussion</a> — the team reviews and prioritizes community feedback.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-it-integrates">How It Integrates<a href="https://developer.tapsell.ir/blog/introducing-taproll#how-it-integrates" class="hash-link" aria-label="Direct link to How It Integrates" title="Direct link to How It Integrates">​</a></h2>
<p>Taproll integrates with ExoPlayer via <code>TaprollAdLoader</code>, which implements the Media3 <code>AdsLoader</code> interface. Wire it through <code>DefaultMediaSourceFactory.setLocalAdInsertionComponents()</code> and ads play automatically at cue points with zero ad-management code.</p>
<div class="language-kotlin codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-kotlin codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// ExoPlayer integration — minimal setup</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> adsLoader </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> TaprollAdLoader</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setAdEventListener</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> adEvent </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* handle event */</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setAdErrorListener</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> adError </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* handle error */</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">val</span><span class="token plain"> player </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ExoPlayer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setMediaSourceFactory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">DefaultMediaSourceFactory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setLocalAdInsertionComponents</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> adsLoader </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> playerView</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="getting-started">Getting Started<a href="https://developer.tapsell.ir/blog/introducing-taproll#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started">​</a></h2>
<p>Taproll is part of <strong><a href="https://developer.tapsell.ir/docs/sdk">Tapsell Mediation SDK</a></strong> and fully integrated with it. Add the <a href="https://developer.tapsell.ir/docs/sdk/platforms/android/adnetworks/tapsellLegacy">legacy adapter</a> Taproll integration to your project:</p>
<div class="language-groovy codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-groovy codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// build.gradle</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dependencies </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    implementation </span><span class="token string" style="color:#e3116c">'ir.tapsell.mediation.adapter:legacy-taproll:$tapsellVersion'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>For full setup instructions and ExoPlayer integration details, refer to the <a href="https://developer.tapsell.ir/docs/sdk/platforms/android/ad-formats/preroll#play-with-taproll">Taproll documentation</a> and <a href="https://github.com/tapsellorg/TapsellMediation-AndroidSample">sample app</a>.</p>]]></content>
        <author>
            <name>Farhad Beigirad</name>
            <uri>https://github.com/beigirad</uri>
        </author>
        <author>
            <name>Morteza Nedaei</name>
            <uri>https://github.com/mortezanedaei</uri>
        </author>
        <category label="taproll" term="taproll"/>
        <category label="instream-ads" term="instream-ads"/>
        <category label="pre-roll" term="pre-roll"/>
        <category label="Tapsell" term="Tapsell"/>
        <category label="Android" term="Android"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tapsell Maven repository is introduced for Android Developers]]></title>
        <id>https://developer.tapsell.ir/blog/tapsell-android-maven</id>
        <link href="https://developer.tapsell.ir/blog/tapsell-android-maven"/>
        <updated>2026-03-31T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[We've introduced Tapsell Maven — a dedicated Maven repository and package mirror hosted at maven.tapsell.ir — to give Android developers a reliable, fast way to download Tapsell SDKs and all their transitive dependencies without hitting rate limits or connectivity issues with external repositories.]]></summary>
        <content type="html"><![CDATA[<p>We've introduced <strong>Tapsell Maven</strong> — a dedicated Maven repository and package mirror hosted at <code>maven.tapsell.ir</code> — to give Android developers a reliable, fast way to download Tapsell SDKs and all their transitive dependencies without hitting rate limits or connectivity issues with external repositories.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-tapsell-maven">Why Tapsell Maven?<a href="https://developer.tapsell.ir/blog/tapsell-android-maven#why-tapsell-maven" class="hash-link" aria-label="Direct link to Why Tapsell Maven?" title="Direct link to Why Tapsell Maven?">​</a></h2>
<p>Tapsell packages depend on a number of third-party libraries. Fetching all of them from scattered external sources can be slow or unreliable, especially in restricted network environments. By mirroring everything through <code>maven.tapsell.ir</code>, you get:</p>
<ul>
<li><strong>Single source of truth</strong> — Tapsell SDKs and their dependencies served from one place.</li>
<li><strong>Faster downloads</strong> — servers are optimised for developers in the region.</li>
<li><strong>Higher reliability</strong> — no more transient failures from upstream registries.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="adding-the-repository">Adding the Repository<a href="https://developer.tapsell.ir/blog/tapsell-android-maven#adding-the-repository" class="hash-link" aria-label="Direct link to Adding the Repository" title="Direct link to Adding the Repository">​</a></h2>
<p>Depending on your project's Gradle setup, add the Tapsell Maven URL in one of the following ways:</p>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">settings.gradle (recommended)</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">build.gradle (legacy)</li></ul><div role="tabpanel" class="tabItem_Ymn6 margin-top--md"><div class="language-groovy codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-groovy codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// settings.gradle</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dependencyResolutionManagement </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    repositoriesMode</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">RepositoriesMode</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">FAIL_ON_PROJECT_REPOS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    repositories </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Tapsell repository</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        maven </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">uri</span><span class="token punctuation" style="color:#393A34">(</span><span class="token interpolation-string string" style="color:#e3116c">"https://maven.tapsell.ir"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">google</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">mavenCentral</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Kotlin DSL</div><div class="admonitionContent_BuS1"><p>If your project uses Kotlin DSL (<code>.kts</code> files), replace <code>uri("...")</code> with the same expression — the syntax is identical in both Groovy and Kotlin DSL.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="next-steps">Next Steps<a href="https://developer.tapsell.ir/blog/tapsell-android-maven#next-steps" class="hash-link" aria-label="Direct link to Next Steps" title="Direct link to Next Steps">​</a></h2>
<p>Once the repository is added, follow the full Android SDK setup guide to add the Tapsell dependency to your app module and initialise the SDK:</p>
<p><a href="https://developer.tapsell.ir/docs/sdk/platforms/android/quick-start/#set-up-your-app">Android Quick Start — Set up your app</a></p>]]></content>
        <author>
            <name>Morteza Nedaei</name>
            <uri>https://github.com/mortezanedaei</uri>
        </author>
        <author>
            <name>Farhad Beigirad</name>
            <uri>https://github.com/beigirad</uri>
        </author>
        <category label="Tapsell" term="Tapsell"/>
        <category label="Android" term="Android"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[تمرین با هم فکر کردن]]></title>
        <id>https://developer.tapsell.ir/blog/psd-intro</id>
        <link href="https://developer.tapsell.ir/blog/psd-intro"/>
        <updated>2025-06-07T18:00:00.000Z</updated>
        <summary type="html"><![CDATA[تا مدت‌ها فکر می‌کردم یادگیری یعنی تنهاییِ عمیقِ غرق‌شدن در کتاب‌ها.]]></summary>
        <content type="html"><![CDATA[<p>تا مدت‌ها فکر می‌کردم یادگیری یعنی تنهاییِ عمیقِ غرق‌شدن در کتاب‌ها.
ولی از جایی به بعد، فهمیدم بعضی از مهم‌ترین سؤال‌های فنی رو فقط توی گفت‌وگو با بقیه می‌شه دید و پروروند.
از وقتی به تپسل پیوستم، یکی از چیزهایی که توی تیم برای من پررنگ بود، علاقه‌مندی جمعی به یاد گرفتن، بهبود و به اشتراک گذاشتن آموخته‌ها بود.
اون هم نه صرفاً در قالب ارائه‌های رسمی، بلکه در فضایی خودمونی و همراه با تعامل.
این شد که دوباره یاد دغدغه‌هایی افتادم که شاید مدتی پشت ددلاین‌ها گم شده بودن:
مثل اینکه کیفیت یه تصمیم طراحی چقدر می‌تونه مسیر یه پروژه رو عوض کنه، یا اصلاً «کد خوب» یعنی چی وقتی قراره توی یه تیم نوشته و نگه‌داری بشه؟
این شد که یکی از شب‌های خنک و دلچسب اردیبهشت که انسان رو برای زندگی بیشتر به وجد می‌آره، توی تاپیک <code>Knowledge Sharing</code> تیم، دو تا کتاب رو پیشنهاد دادم:</p>
<!-- -->
<div class="row"><div class="col col--6"><h3 class="text--center">Cryptography Engineering: Design Principles and Practical Applications</h3><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAALCAYAAABGbhwYAAAACXBIWXMAAAsTAAALEwEAmpwYAAABkElEQVR4nBXB0U8ScQDA8d8/Wi9mbVFBOFCahZMoccuX1oOPzkypSQZ2s0MxI+AA4UBAOTnCIDwKuc4GFrr4tj4fMZcqsVKosV1rslg8YSl7jFRpcj684r/LvyNGIxD2D0Wur2cZ38hij6g8i+WYiaRYy2oc9iy0rkXDGiDGpQK+WBm3tM8jKcNEJMu8rODaSPMiU6F02uLw9AxxS8owuZVjQlK4/TbNwkeV5/EktlAG22YB6VgnWq0jxoK7BKKfWEzFGYuouHaK+DeT2NYTTEYPWMtr7Bw1EPdCezjlPLPxHM6oyv33CtNyHkcoyULigJclHev3JSIQjnJjReLaqz0cqzFm38jceS1zc1nm6fY+S0qRhtFGOKc8OGf8eHwB7nq8uL0+7N7HTD2ZZ9o/h+PBQ1xuN+Jrt8NWoUpOb5GoVDFMk6BSIpg/Iq23COermL9MhDW84HO9TblzzreehdHvs6yUiehtVOMnkmYwuBoizD99drUTyoZF83uPerfDakolXK6hNH/wrvSFs4sB/wA6JGCOH1qOyAAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="482" height="522"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/book_philosophy_of_software_design.d580c8a.482.png" srcset="/assets/ideal-img/book_philosophy_of_software_design.d580c8a.482.png 482w" width="482" height="522"></noscript></div></div><div class="col col--6"><h3 class="text--center">Philosophy of Software Design</h3><div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAYAAACQN/8FAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwUlEQVR4nBXK308SAQDA8XsMuDu4O+4H9yPgEATyIPEHJDcRUIeIZVS0tFK0LatNUxvrIcea+tJLrc36c7+tz/NHkKQUsuQhSy6i5BCJ2IixNLFIhti9LFI0hxIvIkhiirjsEY2k8P2HvN5/x+jFmMODDxyNT/l48pXO2j6CJDnEojZi1CEIQqbTG75cfmN69YPzs2tub36z93KCYKfyVINHWGaJbKZBszEirB/TDj8TNs5Yb09oNS8QdD3H5sYOi7UOht7AMZ6Q846oFM9Zrk6pV76zVLlCMIwCnc6A7f6IcnEX33tDbe6CcOGabv0XvZW/9Jp3CK4bsLY6oN0aEpRHzPqH1OcntJZu6dZ/shXesb36B0FTCyTVEra5iG1t4FqPmbm/Ryn3niB/SqVwSbUwQVASBXStjGMuY5ktdK2Laz7F9w7IZ44pZE8o+p/+xxmUeB4jWUPXV1ASIZa+jZd6RsZ5he+9ZSY9RlCVHK5dwbUX0NQaifgiSWUDS9vBMXbxzCGuOUQwzVkG/eesd4aoaoAszqEkmiTjmxjKAFPbwVT7CHIiTdqrkE7Po6gPECNFZHEJTWpjKT2MRA9V7vAP9bfPSVAWoI4AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="415" height="522"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/book_cryptography_engineering.13f8069.415.png" srcset="/assets/ideal-img/book_cryptography_engineering.13f8069.415.png 415w" width="415" height="522"></noscript></div></div></div>
<p></p>
<p>خوشبختانه پیشنهاد با استقبال خوبی مواجه شد، و مشخص شد این دغدغه، نه فقط یک دغدغه‌ی شخصی، که یک دغدغه‌ی تیمیه. با مشورت بچه‌های تیم، تصمیم گرفتیم مطالعه‌ی کتاب دوم رو شروع کنیم.
قرار شد هر هفته بخشی از کتاب رو بخونیم و یک جلسه‌ی هفتگی داشته باشیم برای بحث و گفت‌وگو درباره‌ی اون بخش.</p>
<p>اما چرا این کتاب رو انتخاب کردیم؟ چند دلیل داشتیم:</p>
<p><strong>۱. ساختن یک روتین سبک و منظم برای مطالعه:</strong> شاید این روتین بتونه کمک کنه از دام کمال‌گرایی نجات پیدا کنیم؛ اینکه برای به اشتراک‌گذاری یا یادگیری، لازم نیست همیشه موضوع خیلی پیچیده یا عجیبی مطرح بشه.</p>
<p><strong>۲. زبان ساده و روان کتاب:</strong> باعث می‌شد هم خوندنش آسون‌تر باشه، هم گفت‌وگو راجع بهش.</p>
<p><strong>۳. تمرکز بر مسائل بنیادی ولی مهم:</strong> کتاب ابزار یا تکنیک خاصی یاد نمی‌ده، ولی یک دید خوبی می‌ده که می‌تونه در تصمیم‌های کوچک فنی تأثیرگذار باشه. مثلاً اینکه اگر بشه یه قطعه کد رو به دو روش نوشت، کدوم روش احتمالاً پایدارتر، خواناتر یا قابل‌نگهداری‌تره؟</p>
<p><strong>۴. نبود جزییات فنی پیچیده:</strong> خوندنش زمان زیادی نمی‌برد و همین باعث می‌شه برای شروع یک حلقه‌ی مطالعه جمعی گزینه‌ی خوبی باشه. اگر تجربه‌ی خوبی بود، می‌تونیم در ادامه سراغ موضوعات عمیق‌تر هم بریم.</p>
<p><strong>۵. نزدیکی مثال‌های کتاب به زبان‌های جاوا و سی:</strong> که باعث می‌شه مثال‌ها ملموس‌تر باشن، چون بخش زیادی از کدهای ما هم به جاوا و کاتلین نوشته شدن.</p>
<p><strong>۶. هم‌زمانی با نیاز تیم به بازبینی کد:</strong> با توجه به عمر پروژه و روندهای اخیر، برخی تسک‌ها مربوط به بازنگری در بخش‌هایی از کد بودن. این کتاب می‌تونست دید بهتری برای انجام این بازبینی‌ها بهمون بده.</p>
<p>امیدواریم این تجربه‌ی جمعی، فارغ از نتیجه‌ی نهایی، بتونه برامون شروعی باشه برای بیشتر فکر کردن به طراحی نرم‌افزار، بهتر دیدن کدهایی که می‌نویسیم، و شنیدن صداهای مختلف در مورد مسائل فنی روزمره‌ای که شاید تا حالا از کنارشون بی‌تفاوت رد می‌شدیم.</p>
<p>تیم ما مشتاقه که بخش‌هایی از نتیجه‌ی این جلسات رو در بلاگ شرکت منتشر کنه، شاید نه فقط برای مستندسازی مسیرمون، بلکه برای به اشتراک گذاشتن چیزهایی که فکر می‌کنیم برای دیگر تیم‌ها هم مفید یا الهام‌بخش باشن.</p>]]></content>
        <author>
            <name>Sajede Talebi</name>
        </author>
        <category label="Tapsell" term="Tapsell"/>
        <category label="Knowledge Sharing" term="Knowledge Sharing"/>
    </entry>
</feed>