شما با کارهای خسته کننده آشنا هستید: بروزرسانی فایلهای پیکربندی، کپی و پیست کردن فایلها و بروزرسانی تیکتهای Jira.
وقتی که پیشتر در سال 2016 برای یک شرکت بازی آنلاین کار میکردم، کار من تقریبا همین بود. این کار در زمانهایی که من باید templateهای پیکربندی را میساختم، میتوانست بسیار امیدوار کننده باشد؛ اما من تقریبا ۷۰ درصد وقت خود را بر روی کپی کردن templateها و گسترش پیادهسازیهای reskin شده صرف کردم.
Reskin چیست؟
مفهوم Reskin در شرکت مورد نظر، استفاده از مکانیک، صفحات و موقعیتگذاری عناصر بازی مشابه بود، در حالیکه زیباییهای بصری مانند رنگ و داراییها را تغییر میدادیم. پس در زمینه یک بازی سنگ کاغذ قیچی ساده، ما سه template با داراییهای پایه، به این صورت طراحی میکنیم:
اما وقتی که یک reskin از این را بسازیم، از داراییهای متفاوتی استفاده خواهیم کرد و بازی همچنان کار خواهد کرد. اگر به بازیهایی مانند Candy Crush یا Angry Birds نگاه کنید، خواهید دید که آنها چندین تنوع از یک بازی را دارند. مثلا نسخههای هالووین، کریسمس و... از نظر کسب و کار، این کار کاملا با عقل جور در میآید. حال به پیادهسازی خود بر میگردیم. هر کدام از بازیهای جدید ما، فایل bundle شده JavaScript مشابه را خواهند داشت، و در یک فایل JSON بارگذاری خواهند شد که محتویات و مسیرهای دارایی متفاوتی دارند. نتیجه چیست؟
من و دیگر توسعه دهندگان برنامههای روزانه مختلفی را چیده بودیم، و اولین فکر من این بود: «بسیاری از این کار را میتوانند به صورت خودکار انجام شوند.» هر زمان که بازی جدیدی میساختم، مجبور بودم این اقدام را بگذرانم:
- یک git pull بر روی مخزن templateها انجام دهم تا مطمئن شوم که بروز هستند.
- یک شاخه جدید، (که توسط آیدی تیکت Jira شناخته میشود) از شاخه اصلی بسازم.
- یک کپی از templateهایی که باید میساختم بگیرم.
- gulp را اجرا کنم.
- محتویات فایل config.json را بروزرسانی کنم. این کار شامل مسیرهای دارایی، headingها و پاراگرافها، و همچنین درخواستهای سرویس داده هم میشد.
- ساختن به صورت local (داخلی) و بررسی تطبیق محتویات، با سند اصلی سهامداران.
- تایید این که طراحان با ظاهر آن راضی هستند.
- ترکیب با شاخه اصلی و حرکت به سمت مورد بعدی.
- بروزرسانی وضعیت تیکت Jira و جایگذاری یک نظریه برای سهامداران.
- تکرار.
حال این مسئله برای من بسیار اداری از کار توسعه واقعی بود. من در یک نقش پیشین، در معرض اسکریپتنویسی Bash قرار گرفته بودم، و به آن برگشتم تا چند اسکریپت بنویسم تا تلاش مورد نیاز را کاهش دهند. یکی از اسکریپتها، templateها را بروزرسانی میکرد و یک شاخه جدید میساخت، و اسکریپت دیگر یک عملیات commit را انجام میداد و پروژه را به محیطهای استقرار و تولید اتصال میداد.
راهاندازی دستی یک پروژه، سه تا ده دقیقه وقت میخواست. شاید هم پنج تا ده دقیقه برای گسترش. با توجه به پیچیدگی بازی، میتوانست از ده دقیقه تا نصف روز وقت ببرد. اسکریپتها کمک میکردند، اما همچنان وقت زیادی بر روی بروزرسانی محتویات و تلاش برای پیدا کردن اطلاعات ناموجود مورد نیاز بود.
نوشتن کد برای ذخیره زمان کافی نبود. من به دنبال رویکرد بهتری برای جریان کاری خود بودم، تا بتوانم بیشتر از اسکریپتها استفاده کنم. محتویات را از خارج سند منتقل کرده، و به تیکتهای Jira وارد کنم. برای طراحان بگویم به جای فرستادن یک لینک به جایی که داراییها بر روی یک درایو عمومی قرار دارد، میتوانید یک repository سیستم تحویل محتویات، (CDN = Content Delivery System) به همراه یک URL استقرار و تولید به داراییها راه بیندازید.
اِیپیآی Jira
اعمال موارد این چنینی میتواند کمی زمان ببرد، اما روند ما به مرور زمان ارتقا یافت. من مقداری تحقیقات بر روی اِیپیآی Jira و ابزار مدیریت پروژه ما انجام دادم، و تعدادی درخواست به تیکتهای Jira که بر رویشان کار میکردم ارسال کردم. من مقدار زیادی دادههای با ارزش به دست آوردم. اینقدر با ارزش که تصمیم گرفتم آنها را با اسکریپتهای Bash خود ادغام کنم تا مقادیر را از تیکتهای Jira بخوانم، و همچنین هنگامی که کارم تمام شد، نظریههایی به سهامداران ارسال کنم.
ترجمه Bash به Node
اسکریپتهای Bash خوب بودند؛ اما اگر کسی بر روی یک دستگاه ویندوز کار میکرد، نمیتوانست آنها را اجرا کند. پس از مقداری تحقیق، تصمیم گرفتم تا از JavaScript برای جمعبندی کل فرایند در یک ابزار ساخت سفارشی استفاده کنم. من آن را Mason نامگذاری کردم.
CLI
وقتی که از Git در ترمینال خود استفاده میکنید، متوجه خواهید شد که یک رابط خط دستوری بسیار کاربر دوست دارد. اگر یک دستور را غلط بنویسید، Git به طور مودبانه پیشنهادی درباره این که شما چه کاری میخواستید انجام دهید، میدهد. کتابخانهای به نام commander هم رفتار مشابهی را اعمال میکنم، و این تنها یکی از کتابخانههای زیادی است که من استفاده کردم.
این مثال کد سادهسازی شده را در نظر بگیرید. این کد، یک برنامه رابط خط دستوری (CLI = Command Line Interface) را bootstrap میکند.
src/mason.js:
#! /usr/bin/env node
const mason = require('commander');
const { version } = require('./package.json');
const console = require('console');
// دستورات
const create = require('./commands/create');
const setup = require('./commands/setup');
mason
.version(version);
mason
.command('setup [env]')
.description('run setup commands for all envs')
.action(setup);
mason
.command('create <ticketId>')
.description('creates a new game')
.action(create);
mason
.command('*')
.action(() => {
mason.help();
});
mason.parse(process.argv);
if (!mason.args.length) {
mason.help();
}
با استفاده از npm، شما میتوانید یک لینک را از فایل package.json خود اجرا کنید، که این کار یک نام مستعار global خواهد ساخت.
...
"bin": {
"mason": "src/mason.js"
},
...
وقتی که من لینک npm را در ریشه پروژه اجرا میکنم:
npm link
یک خط دستوری را برای من فراهم میکند که میتوانم آن را فراخوانی کنم، و این خط دستوری mason نام دارد. پس هر زمان که من mason را در خط دستوری خود فراخوانی میکنم، خط دستوری مورد نظر اسکریپت mason را اجرا خواهد کرد. همه عملیاتها تحت یک چتر دستور به نام mason قرار میگیرند، و من هر روزه از آن برای ساخت بازی استفاده کردم. میزان زمانی که با انجام این کار از هدر رفتن آن جلوگیری کردم، شگفتانگیز بود.
میتوانید در اینجا ببینید که من یک شماره تیکت Jira را به عنوان یک آرگومان به دستور مورد نظر ارسال میکنم. این کار، اِیپیآی Jira را حلقه میزند، و تمام اطلاعاتی که برای بروزرسانی بازی نیاز دارم را دریافت میکند. سپس هم ادامه داده، و پروژه را ساخته و گسترش میدهد. بعد از آن من یک نظریه را به سهامداران و طراحان پست میکنم تا بدانند که کار به اتمام رسیده است.
$ mason create GS-234
... فراخوانی اِیپیآی Jira.
... مقادیر دریافت شدند.
... ساخت یک شاخه جدید، از شاخه اصلی به نام «GS-234».
... بروزرسانی مخزن templateها.
... کپی کردن از template با نام «pick-from-three».
... تزریق مقادیر به داخل فایل پیکربندی JSON.
... ساخت پروژه.
... گسترش بازی.
... عالی! حال میتوانیم یک لینک برای بازی خود قرار دهیم.
... نظریه ارسال شده: بازی مورد نظر منتشر شد. آیا علامت آن خوب به نظر میرسد؟
همه چیز با تعدادی حرکت کلیدی به اتمام رسید!
من درک میکنم که شرایط و جریانها در هر کسب و کاری متفاوت هستند، اما شما باید بتوانید چیزی را پیدا کنید که روز شما را در دفتر کاریتان کمی آسانتر کند.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید