اکثر توسعه‌دهندگان ویژگی‌ای را عرضه می‌کنند که در مرورگر بی‌نقص به نظر می‌رسد و تصور می‌کنند کار سخت تمام شده است. من هم دقیقاً همین اشتباه را هنگام ساخت وبلاگ غذایی Django خود مرتکب شدم. دستور پخت‌ها به درستی نمایش داده می‌شدند. روابط پایگاه داده دقیق بودند. قالب‌ها هم در موبایل و هم در دسکتاپ عالی به نظر می‌رسیدند. اما موتورهای جستجو را رها کرده بودم تا خودشان همه چیز را بفهمند، و آن‌ها در حدس زدن چندان خوب عمل نمی‌کنند.

در چند جلسه توسعه اخیر، آن غفلت را برطرف کردم. زیربنای اصلی SEO را تکمیل کردم. این تجربه‌ای بود که یادآوری کرد یک اپلیکیشن آماده‌ی تولید (production-ready)، به چیزی بسیار فراتر از کدی که بدون خطا اجرا می‌شود، نیاز دارد.

فراتر از کارخانه‌ی ویژگی‌ها (Feature Factory)

نرم‌افزارِ کارآمد تنها شروع کار است. کاربران تنها محصولی را دوست خواهند داشت که بتوانند آن را پیدا کنند، و موتورهای جستجو همچنان مسیر اصلی برای اکثر سایت‌های محتوا-محور هستند. بقای یک وبلاگ دستور پخت به این بستگی دارد که آیا کسی که عبارت "overnight sourdough bread" را جستجو می‌کند، در زمان مناسب به صفحه درست هدایت شود یا خیر.

این قابلیتِ یافت‌شدنی (discoverability) به صورت پیش‌فرض اتفاق نمی‌افتد. این امر مستلزم متادیتایی است که توضیح دهد هر صفحه حاوی چه چیزی است. مستلزم داده‌های ساختاریافته‌ای (structured data) است که یک توده از HTML را به یک موجودیت تعریف‌شده با زمان پخت، مواد اولیه و امتیازات تبدیل کند. بدون این عناصر، حتی بهترین محتوا نیز در انزوا باقی می‌ماند و برای خزنده‌هایی (crawlers) که تصمیم می‌گیرند دنیا چه چیزی را ببیند، نامرئی است.

پروژه Django من تمام بخش‌های عملکردی را داشت، اما فاقد لایه ترجمه بین کد من و منطق موتور جستجو بود. پر کردن این شکاف به معنای برخورد با SEO فنی به عنوان یک الزام مهندسی بود، نه صرفاً یک موضوع فرعی برای بازاریابی.

زیربنای اصلی SEO در واقع چگونه است

این کار درباره پر کردن متن با کلمات کلیدی (keyword stuffing) یا نوشتن عناوین کلیک‌خور (clickbait) نبود. SEO فنی برای یک اپلیکیشن Django، امری مشخص، مکانیکی و عمیقاً ادغام‌شده با نحوه سرویس‌دهی صفحات توسط فریم‌ورک است.

با موارد پایه‌ای که در قسمت <head> هر سند قرار دارند، شروع کردم. تگ‌های عنوان (title tags) پویا و متادیسکریپشن‌ها اکنون مستقیماً از فیلدهای مدل (model fields) فراخوانی می‌شوند. وقتی کاربری از یک صفحه دستور پخت بازدید می‌کند، تگ عنوان نام واقعی دستور پخت و دسته‌بندی آن را نشان می‌دهد، نه یک هدر عمومی سایت را. تگ‌های Open Graph نیز همراه آن‌ها هستند تا لینک‌های به اشتراک گذاشته شده، به جای یک کارت خالی، با تصویر، توضیحات و متن پیش‌نمایش صحیح باز شوند.

سپس به سراغ نشانه‌گذاری اسکیما (schema markup) رفتم. یک وبلاگ غذا کاندیدای ایده‌آلی برای داده‌های ساختاریافته است، زیرا دستور پخت‌ها دارای ویژگی‌های جهانی و قابل درک هستند. با افزودن نشانه‌گذاری JSON-LD Recipe به هر صفحه، اپلیکیشن می‌تواند زمان آماده‌سازی، زمان پخت، لیست مواد اولیه و مجموع امتیازات را به زبانی که موتورهای جستجو به طور بومی می‌خوانند، منتقل کند. این کار جنبه تزئینی ندارد؛ بلکه تفاوت بین نمایش به عنوان یک لینک آبی ساده و واجد شرایط شدن برای نتایج غنی (rich results) است که امتیازات ستاره‌ای و مدت زمان پخت را مستقیماً در صفحه جستجو نشان می‌دهند.

همچنین خطراتی را که اگر نادیده گرفته شوند توسط Django ایجاد می‌شوند، مدیریت کردم. Viewهای مبتنی بر کلاس (Class-based views) می‌توانند به راحتی محتوای مشابهی را تحت الگوهای URL مختلف ارائه دهند که باعث پراکندگی اعتبار SEO شما در صفحات تکراری می‌شود. من URLهای اصلی (canonical URLs) را اضافه کردم تا آن سیگنال‌ها را یکپارچه کرده و موتورهای جستجو را به نسخه نهایی هر منبع هدایت کنم.

در نهایت، زیرساخت کشف (discovery infrastructure) را پیکربندی کردم. Django همراه با یک فریم‌ورک sitemap ارائه می‌شود و اتصال آن به سیستم، به خزنده‌ها یک فهرست صریح از آنچه در سایت بیشترین اهمیت را دارد می‌دهد. یک فایل robots.txt که به درستی پیکربندی شده باشد نیز در کنار آن قرار می‌گیرد و ربات‌ها را به سمت محتوای ارزشمند و دور از صفحاتی که هرگز نباید در نتایج جستجو ظاهر شوند (مانند داشبوردهای کاربری یا مسیرهای ادمین) هدایت می‌کند.

این تغییرات در کنار هم، سه نتیجه ملموس به همراه دارند:

  • خزنده‌ها سریع‌تر حرکت می‌کنند. یک معماری منطقی سایت با یک sitemap تمیز و لینک‌سازی داخلی معقول، به این معناست که ربات‌های موتور جستجو بودجه خود را به جای سرگردانی در بن‌بست‌ها، به طور کارآمد مصرف می‌کنند.
  • محتوا به دقت ایندکس می‌شود. متادیتای شفاف و نشانه‌گذاری معنایی (semantic markup) هیچ ابهامی در مورد محتوای صفحه باقی نمی‌گذارند. موتور جستجو نیازی ندارد حدس بزند که یک صفحه دستور پخت است؛ بلکه آن را می‌داند.
  • صفحات به دیده شدن واقعی در جستجو دست می‌یابند. اسنیپت‌های غنی (Rich snippets) و لیست‌های بهبودیافته تصادفی نیستند. آن‌ها از داده‌های ساختاریافته‌ای نشأت می‌گیرند که محتوای شما را برای نمایش ویژه در نتایج، واجد شرایط می‌کنند.

چرا زیرساخت‌های نامرئی اهمیت دارند

هیچ بازدیدکننده‌ای از تگ‌های لینک canonical شما تعریف نخواهد کرد. هیچ‌کس برای متادیسکریپشن‌ها یا پیاده‌سازی اسکیما شما کامنت تحسین‌آمیزی نمی‌نویسد. این تغییرات کاملاً از دید افرادی که از آن‌ها بهره می‌برند پنهان می‌مانند، و این دقیقاً همان چیزی است که آن‌ها را حرفه‌ای می‌کند.

زیرساخت‌های نامرئی، مشخصه‌ی نرم‌افزارهای سطح تولید هستند. کاربران به‌ندرت متوجه احراز هویت صحیح می‌شوند، مگر زمانی که داده‌هایشان را نجات دهد. آن‌ها تا زمانی که یک پرس‌وجو (query) به‌صورت آنی بارگذاری نشود، به ایندکس‌گذاری پایگاه داده فکر نمی‌کنند. همین اصل در اینجا نیز صدق می‌کند. یک پیش‌نمایش اجتماعی مناسب، به‌سادگی کار می‌کند. یک دستور پخت در جستجو با تصویر بندانگشتی و امتیاز صحیح ظاهر می‌شود، زیرا کسی کارِ کم‌زرق‌وبرقِ اتصال Open Graph و schema markup را در پشت صحنه انجام داده است.

این لایه‌های پنهان، پروژه را برای استفاده در دنیای واقعی آماده می‌کنند. پروژه‌های تفننی، ظاهر (frontend) را صیقل می‌دهند و امیدوارند گوگل بقیه‌ی کارها را ردیف کند. پروژه‌های جدی، قابلیت یافتن (discoverability) را به عنوان یک ویژگی اصلی و با همان اولویت امنیت یا یکپارچگی داده‌ها در نظر می‌گیرند. با تکمیل این زیربنا، من به این نتیجه رسیدم که اگر سیستم‌هایی که کاربران را به کد متصل می‌کنند نتوانند بفهمند کاربران به چه چیزی نگاه می‌کنند، کد عالی معنای چندانی نخواهد داشت.

مسیر پیش رو

با تثبیت زیربنای SEO، اکنون به سراغ کارهایی می‌روم که کاربران واقعاً خواهند دید و با آن‌ها تعامل خواهند داشت. اولویت‌های بعدی من شامل ساخت ویژگی‌های جدید برای کاربردی‌تر کردن وبلاگ، بهینه‌سازی عملکرد برای بارگذاری بدون تأخیر صفحات، و آماده‌سازی برای استقرار در محیط تولید (production deployment) است.

ویژگی‌های جدید، قابلیت‌های سایت را فراتر از نمایش ساده‌ی دستور پخت‌ها گسترش خواهند داد. بهینه‌سازی عملکرد، به کارایی پرس‌وجوها، مدیریت تصاویر و تفاوت بین سایتی که به‌صورت محلی (locally) کار می‌کند با سایتی که تحت فشار ترافیک پاسخگو است، خواهد پرداخت. استقرار در محیط تولید به معنای امن‌سازی متغیرهای محیطی، پیکربندی تحویل فایل‌های استاتیک، راه‌اندازی سیستم ثبت وقایع (logging) مناسب و بررسی چک‌لیست‌های امنیتی است؛ مواردی که وقتی پای داده‌های واقعی و کاربران واقعی در میان است، نمی‌توان از آن‌ها چشم‌پوشی کرد.

هر یک از این وظایف اکنون بر روی یک پایه‌ی مستحکم بنا شده‌اند. اپلیکیشن با زبان موتورهای جستجو صحبت می‌کند. اکنون برای ترافیکی که تنها زمانی می‌آید که ساختار فنی شما مرتب باشد، آماده است.

نکته اصلی: توسعه‌دهندگان اغلب با SEO مانند وظیفه‌ی شخص دیگری برخورد می‌کنند که پس از پایان توسعه انجام می‌شود. این تفکیک، مصنوعی و پرهزینه است. اگر از همان ابتدا با متادیتا، داده‌های ساختاریافته و قابلیت دسترسی خزنده‌ها (crawler accessibility) به عنوان وظایف مهندسی برخورد کنید، اپلیکیشن‌هایی می‌سازید که واقعاً تکمیل‌شده هستند، نه اینکه صرفاً کاربردی باشند. موارد نامرئی را درست انجام دهید. همین است که یک پروژه را از پروژه‌ای که فقط اجرا می‌شود، به پروژه‌ای که اهمیت دارد، متمایز می‌کند.