26 KiB
چالش BankFlow 2026
۱. مقدمه
در این چالش، شما مسئول طراحی و پیادهسازی یک سامانه Backend برای پردازش درخواستهای تسهیلات بانکی هستید. هدف صرفاً نوشتن چند API یا پیادهسازی مجموعهای از قابلیتهای مشخص نیست؛ انتظار میرود راهکاری ارائه کنید که از نظر طراحی نرمافزار، توسعهپذیری، خوانایی کد و نگهداری، کیفیت مناسبی داشته باشد.
علاوه بر صحت عملکرد سیستم، کیفیت تصمیمهای مهندسی شما نیز ارزیابی خواهد شد. بنابراین معماری سیستم، نحوه مدلسازی فرایندها، تفکیک مسئولیتها و توسعهپذیری راهکار، بهاندازه عملکرد صحیح آن اهمیت دارد.
۲. داستان مسئله
شرکت داتین یکی از ارائهدهندگان زیرساختهای بانکی (Banking Service Provider) است و سرویسهای مختلفی را در اختیار بانکها و مؤسسات مالی قرار میدهد. یکی از محصولات این شرکت، سامانه پردازش درخواست تسهیلات است.
روزانه هزاران درخواست وام از بانکهای مختلف وارد این سامانه میشود. هر درخواست باید پیش از تأیید نهایی، مراحل مختلفی را طی کند. برای نمونه:
ثبت درخواست
↓
اعتبارسنجی اولیه
↓
بررسی تقلب
↓
اعتبارسنجی مالی
↓
تأیید مدیر
↓
تأیید نهایی
تمام بانکها فرایند یکسانی ندارند. برای مثال:
| بانک | فرایند نمونه |
|---|---|
| بانک اول | اعتبارسنجی ← بررسی تقلب ← اعتبارسنجی مالی ← تأیید |
| بانک دوم | اعتبارسنجی ← بررسی AML ← بررسی تقلب ← بررسی ضامن ← اعتبارسنجی مالی ← تأیید |
| بانک سوم | اعتبارسنجی ← تأیید مدیر ← تأیید |
مدیریت شرکت تصمیم گرفته است نسخه دوم این سامانه را با تمرکز بر توسعهپذیری و نگهداری آسان طراحی کند. شما بهعنوان تیم توسعه، مسئول طراحی این نسخه جدید هستید.
۳. هدف چالش
هدف، طراحی و پیادهسازی یک سامانه پردازش درخواست تسهیلات است که بتواند فرایند بررسی درخواستهای وام را مدیریت کند.
سامانه باید امکانات زیر را فراهم کند:
- ثبت درخواست تسهیلات؛
- پردازش درخواست بر اساس Workflow؛
- مشاهده وضعیت فعلی درخواست؛
- مشاهده تاریخچه پردازش درخواست.
راهکار ارائهشده باید ویژگیهای زیر را داشته باشد:
- طراحی مناسب؛
- توسعهپذیری و نگهداری آسان؛
- خوانایی مناسب؛
- قابلیت تست؛
- تفکیک صحیح مسئولیتها.
۴. محدوده مسئله
تنها مسئولیت شما پیادهسازی سامانه پردازش درخواست تسهیلات است. سرویسها و قابلیتهای خارج از این محدوده، بخشی از چالش محسوب نمیشوند.
قابلیتهای الزامی
- ثبت درخواست تسهیلات؛
- اجرای فرایند بررسی درخواست؛
- مدیریت وضعیت درخواست؛
- ثبت تاریخچه اجرای مراحل؛
- نگهداری اطلاعات پس از راهاندازی مجدد برنامه؛
- ارائه REST API؛
- اجرای پروژه از طریق Docker.
موارد خارج از محدوده
پیادهسازی موارد زیر الزامی نیست:
- احراز هویت و مجوزدهی کاربران؛
- مدیریت نقشها و سطوح دسترسی؛
- رابط کاربری؛
- اتصال واقعی به سامانههای بانکی؛
- ارسال پیامک، ایمیل یا اعلان؛
- Message Brokerهایی مانند Kafka و RabbitMQ؛
- Redis، Kubernetes و استقرار ابری؛
- CI/CD؛
- معماری Microservice؛
- پردازش یا تراکنش توزیعشده؛
- CQRS و Event Sourcing؛
- سامانه واقعی بررسی دستی.
استفاده از این فناوریها امتیاز مستقیم یا اضافی ایجاد نمیکند.
۵. نیازمندیهای عملکردی
FR-1: ثبت درخواست تسهیلات
کاربر باید بتواند یک درخواست جدید ثبت کند. سامانه باید برای هر درخواست، شناسهای یکتا تولید کند.
پس از ثبت موفق، وضعیت اولیه و نخستین مرحله پردازش بهترتیب زیر خواهند بود:
status: SUBMITTED
currentStage: VALIDATION
FR-2: پردازش درخواست
سامانه باید فرایند بررسی درخواست را اجرا کند. پردازش تا زمانی ادامه پیدا میکند که درخواست به یکی از وضعیتهای نهایی زیر برسد:
APPROVEDREJECTEDMANUAL_REVIEW
FR-3: مشاهده اطلاعات درخواست
کاربر باید بتواند حداقل اطلاعات زیر را مشاهده کند:
- شناسه درخواست؛
- اطلاعات ثبتشده؛
- وضعیت فعلی؛
- مرحله فعلی؛
- زمان ایجاد؛
- زمان آخرین تغییر.
FR-4: مشاهده تاریخچه پردازش
برای هر مرحله اجراشده، حداقل اطلاعات زیر باید ذخیره و بهترتیب زمانی نمایش داده شود:
- نام مرحله؛
- نتیجه اجرا؛
- زمان اجرا؛
- علت یا توضیح نتیجه.
FR-5: اجرای Workflow
هر درخواست باید از چند مرحله پردازش عبور کند. هر مرحله فقط مسئول انجام یک وظیفه مشخص است. برای مثال، مرحله اعتبارسنجی فقط صحت اطلاعات ورودی را بررسی میکند و نباید مسئول بررسی اعتبار مالی یا تشخیص تقلب باشد.
FR-6: مدیریت وضعیت
هر درخواست در هر لحظه دقیقاً یک وضعیت جاری دارد. تغییر وضعیتها باید قابل پیشبینی و مطابق قوانین Workflow باشد.
FR-7: ماندگاری اطلاعات
حداقل اطلاعات زیر باید پس از راهاندازی مجدد برنامه حفظ شوند:
- اطلاعات درخواست؛
- وضعیت فعلی؛
- مرحله فعلی؛
- تاریخچه اجرای مراحل.
روش ذخیرهسازی بر عهده شرکتکننده است. استفاده صرف از حافظه (In-Memory Storage) این نیازمندی را برآورده نمیکند.
FR-8: بازیابی پس از راهاندازی مجدد
درخواستهایی که پیشتر ثبت شدهاند، باید پس از راهاندازی مجدد برنامه همچنان قابل مشاهده و پردازش باشند.
FR-9: جلوگیری از پردازش تکراری
اگر عملیات پردازش یک درخواست بیش از یک بار فراخوانی شود، سامانه نباید:
- مراحل قبلی را دوباره اجرا کند؛
- تاریخچه تکراری ایجاد کند؛
- وضعیت نهایی درخواست را تغییر دهد.
FR-10: توسعهپذیری
معماری سامانه باید بهگونهای باشد که افزودن مرحله جدید، تغییر ترتیب مراحل یا تعریف قوانین تصمیمگیری جدید، به بازنویسی گسترده سیستم نیاز نداشته باشد. پیادهسازی این قابلیتهای آینده در نسخه فعلی الزامی نیست، اما طراحی باید از آنها پشتیبانی کند.
۶. انتظارات کیفی
در طراحی سامانه، موارد زیر باید رعایت شوند:
- خوانایی مناسب کد؛
- تفکیک مسئولیتها؛
- وابستگی کم میان بخشهای مختلف؛
- قابلیت تست، توسعه و نگهداری.
استفاده از Design Patternها اجباری نیست. یک الگو فقط زمانی ارزشمند است که مسئلهای واقعی را حل کند؛ پیچیدگی بیشتر لزوماً بهمعنای کیفیت بالاتر نیست.
۷. آزادی در انتخاب فناوری
شرکتکنندگان در انتخاب زبان برنامهنویسی، Framework، پایگاه داده، ORM و ابزارهای توسعه کاملاً آزاد هستند. فناوری انتخابشده بهخودیخود امتیاز مثبت یا منفی ندارد؛ کیفیت راهکار مهمتر است.
۸. مدل دامنه
هر درخواست تسهیلات یک موجودیت مستقل (Entity) است که در طول چرخه عمر خود از مراحل مختلف Workflow عبور میکند.
هر درخواست حداقل شامل اطلاعات زیر است:
| فیلد | نوع | توضیح |
|---|---|---|
loanId |
String |
شناسه یکتای درخواست که سیستم تولید میکند |
customerId |
String |
شناسه مشتری |
amount |
Integer |
مبلغ درخواست |
phone |
String |
شماره تلفن همراه |
loanType |
Enum |
نوع تسهیلات |
monthlyIncome |
Integer |
درآمد ماهانه |
creditScore |
Integer |
امتیاز اعتباری |
hasGuarantor |
Boolean |
وجود یا عدم وجود ضامن |
status |
Enum |
وضعیت فعلی درخواست |
currentStage |
Enum|null |
مرحله فعلی Workflow |
createdAt |
Timestamp |
زمان ایجاد |
updatedAt |
Timestamp |
زمان آخرین تغییر |
انواع تسهیلات
در این نسخه، فقط دو نوع تسهیلات تعریف شده است:
PERSONALBUSINESS
ممکن است در آینده انواع دیگری افزوده شوند.
۹. وضعیتهای درخواست
هر درخواست در هر لحظه دقیقاً یکی از وضعیتهای زیر را دارد:
| وضعیت | توضیح |
|---|---|
SUBMITTED |
درخواست ثبت شده است |
IN_PROGRESS |
درخواست در حال پردازش است |
MANUAL_REVIEW |
درخواست به بررسی دستی نیاز دارد |
APPROVED |
درخواست تأیید شده است |
REJECTED |
درخواست رد شده است |
پس از ورود به یکی از وضعیتهای APPROVED، REJECTED یا MANUAL_REVIEW، پردازش خودکار متوقف میشود.
۱۰. مراحل Workflow
سامانه باید حداقل مراحل زیر را پشتیبانی کند:
| مرحله | مسئولیت |
|---|---|
VALIDATION |
بررسی صحت اطلاعات ورودی |
FRAUD_CHECK |
بررسی تقلب |
GUARANTOR_CHECK |
بررسی وجود ضامن |
CREDIT_CHECK |
بررسی اعتبار مالی |
MANAGER_APPROVAL |
تأیید مدیر |
هر مرحله فقط مسئول یک وظیفه است و منطق دو مرحله نباید در یک کلاس یا ماژول پیادهسازی شود.
۱۱. نتیجه اجرای مراحل
هر مرحله یکی از نتایج زیر را تولید میکند:
PASSFAILMANUAL_REVIEW
در صورت FAIL، پردازش متوقف و وضعیت درخواست REJECTED میشود. در صورت MANUAL_REVIEW، پردازش متوقف و وضعیت درخواست MANUAL_REVIEW میشود.
۱۲. Workflow پایه و مسیرهای شرطی
تمام درخواستها از مسیر زیر آغاز میشوند:
SUBMITTED → VALIDATION → FRAUD_CHECK
اگر VALIDATION یا FRAUD_CHECK با شکست مواجه شود، درخواست رد خواهد شد.
درخواست PERSONAL
VALIDATION
↓
FRAUD_CHECK
↓
CREDIT_CHECK
↓
[در صورت عبور مبلغ از حد تعیینشده: MANAGER_APPROVAL]
↓
APPROVED
درخواست BUSINESS
VALIDATION
↓
FRAUD_CHECK
↓
GUARANTOR_CHECK
↓
CREDIT_CHECK
↓
[در صورت عبور مبلغ از حد تعیینشده: MANAGER_APPROVAL]
↓
APPROVED
۱۳. قوانین اعتبارسنجی
مرحله VALIDATION حداقل باید قوانین زیر را بررسی کند:
| فیلد | قانون | کد خطا |
|---|---|---|
customerId |
الزامی و غیرخالی | INVALID_CUSTOMER_ID |
amount |
عددی بزرگتر از صفر | INVALID_AMOUNT |
phone |
دقیقاً ۱۱ رقم، شروع با 09 و فقط شامل رقم |
INVALID_PHONE |
loanType |
یکی از مقادیر PERSONAL یا BUSINESS |
INVALID_LOAN_TYPE |
monthlyIncome |
عددی نامنفی | INVALID_MONTHLY_INCOME |
creditScore |
عددی بین ۰ تا ۱۰۰۰ | INVALID_CREDIT_SCORE |
اگر یکی از قوانین نقض شود، نتیجه مرحله VALIDATION برابر FAIL خواهد بود.
۱۴. قوانین بررسی تقلب
برای جلوگیری از وابستگی به سرویسهای خارجی، رفتار مرحله FRAUD_CHECK بهصورت Mock تعریف میشود:
| شرط | نتیجه |
|---|---|
customerId با FRAUD آغاز شود |
FAIL |
customerId با REVIEW آغاز شود |
MANUAL_REVIEW |
| سایر موارد | PASS |
۱۵. بررسی ضامن
مرحله GUARANTOR_CHECK فقط برای تسهیلات BUSINESS اجرا میشود:
| شرط | نتیجه |
|---|---|
hasGuarantor == false |
FAIL |
hasGuarantor == true |
PASS |
۱۶. اعتبارسنجی مالی
مرحله CREDIT_CHECK بر اساس creditScore و مقادیر فایل پیکربندی تصمیم میگیرد:
| شرط پیشفرض | نتیجه |
|---|---|
creditScore < 500 |
FAIL |
500 <= creditScore < 650 |
MANUAL_REVIEW |
creditScore >= 650 |
PASS |
۱۷. تأیید مدیر
اگر مبلغ درخواست از managerApprovalThreshold بیشتر باشد، مرحله MANAGER_APPROVAL اجرا میشود. مقدار پیشفرض این حد 500000000 است و باید قابل پیکربندی باشد.
رفتار Mock مدیر بهصورت زیر است:
| شرط | نتیجه |
|---|---|
amount > monthlyIncome × incomeMultiplier |
FAIL |
| سایر موارد | PASS |
۱۸. رفتار بررسی دستی
اگر هر مرحله نتیجه MANUAL_REVIEW برگرداند:
- پردازش متوقف میشود؛
- وضعیت درخواست
MANUAL_REVIEWمیشود؛ currentStageبرابرnullقرار میگیرد؛- اجرای مجدد Workflow بدون تصمیم جدید نباید ادامه پیدا کند.
پیادهسازی سامانه بررسی دستی در این نسخه الزامی نیست.
۱۹. پیکربندی قوانین کسبوکار
قوانین زیر باید از طریق یک فایل پیکربندی با قالبی مانند JSON، YAML، TOML یا Properties قابل تنظیم باشند:
- حداقل امتیاز اعتباری قابل قبول؛
- بازه امتیاز بررسی دستی؛
- سقف نیاز به تأیید مدیر؛
- ضریب بررسی درآمد.
قالب فایل به انتخاب تیم است. تمام مقادیر باید هنگام راهاندازی برنامه خوانده شوند و نیازی به بارگذاری مجدد فایل در زمان اجرا نیست.
نمونه فایل rules.json:
{
"minimumCreditScore": 650,
"managerApprovalThreshold": 500000000,
"incomeMultiplier": 20,
"manualReview": {
"minScore": 500,
"maxScore": 649
}
}
منطق سیستم نباید شامل Magic Numberهای مربوط به این قوانین باشد. برای مثال، مقادیر زیر نباید مستقیماً در کد نوشته شوند:
if (score >= 650) { /* ... */ }
if (amount > 500000000) { /* ... */ }
if (score >= 500 && score < 650) { /* ... */ }
اگر فایل پیکربندی بهشکل زیر تغییر کند، رفتار سامانه باید بدون تغییر کد اصلاح شود:
{
"minimumCreditScore": 700,
"managerApprovalThreshold": 900000000,
"incomeMultiplier": 15,
"manualReview": {
"minScore": 650,
"maxScore": 699
}
}
هدف این بخش، پیادهسازی یک Rule Engine عمومی نیست. کافی است قوانین تعریفشده در این سند از فایل پیکربندی خوانده و در تصمیمگیری سیستم استفاده شوند. پیادهسازی DSL یا Rule Engine اختصاصی امتیاز اضافی ندارد.
۲۰. قرارداد API
تمام APIها باید از استاندارد REST پیروی کنند. قالب تبادل دادهها JSON است و تمام پاسخها باید Header زیر را داشته باشند:
Content-Type: application/json
۲۰.۱. ایجاد درخواست تسهیلات
POST /api/v1/loans
بدنه درخواست
{
"customerId": "C-1001",
"amount": 400000000,
"phone": "09121234567",
"loanType": "PERSONAL",
"monthlyIncome": 50000000,
"creditScore": 720,
"hasGuarantor": false
}
تمام فیلدهای فوق الزامی هستند.
پاسخ موفق
HTTP/1.1 201 Created
{
"loanId": "L-10001",
"status": "SUBMITTED",
"currentStage": "VALIDATION"
}
اگر JSON ارسالی قابل Parse نباشد:
HTTP/1.1 400 Bad Request
{
"error": "INVALID_REQUEST"
}
اعتبارسنجی مقادیری مانند amount و phone داخل Workflow انجام میشود و نباید باعث پاسخ HTTP 400 شود.
۲۰.۲. اجرای Workflow
POST /api/v1/loans/{loanId}/process
پردازش از مرحله فعلی آغاز میشود و تا رسیدن به یکی از وضعیتهای APPROVED، REJECTED یا MANUAL_REVIEW ادامه پیدا میکند.
پاسخ
HTTP/1.1 200 OK
{
"loanId": "L-10001",
"status": "APPROVED",
"currentStage": null
}
نمونه پاسخ برای بررسی دستی:
{
"loanId": "L-10001",
"status": "MANUAL_REVIEW",
"currentStage": null
}
اگر شناسه وجود نداشته باشد:
HTTP/1.1 404 Not Found
{
"error": "LOAN_NOT_FOUND"
}
اگر درخواست قبلاً به وضعیت APPROVED، REJECTED یا MANUAL_REVIEW رسیده باشد، اجرای مجدد این Endpoint نباید Workflow را دوباره اجرا کند و باید وضعیت فعلی را برگرداند.
۲۰.۳. دریافت اطلاعات درخواست
GET /api/v1/loans/{loanId}
پاسخ
{
"loanId": "L-10001",
"customerId": "C-1001",
"amount": 400000000,
"phone": "09121234567",
"loanType": "PERSONAL",
"monthlyIncome": 50000000,
"creditScore": 720,
"hasGuarantor": false,
"status": "APPROVED",
"currentStage": null,
"createdAt": "2026-07-15T10:00:00Z",
"updatedAt": "2026-07-15T10:00:03Z"
}
اگر شناسه وجود نداشته باشد، پاسخ 404 Not Found با کد LOAN_NOT_FOUND برگردانده میشود.
۲۰.۴. دریافت تاریخچه پردازش
GET /api/v1/loans/{loanId}/history
پاسخ
[
{
"stage": "VALIDATION",
"result": "PASS",
"timestamp": "2026-07-15T10:00:00Z",
"reason": "SUCCESS"
},
{
"stage": "FRAUD_CHECK",
"result": "PASS",
"timestamp": "2026-07-15T10:00:01Z",
"reason": "SUCCESS"
},
{
"stage": "CREDIT_CHECK",
"result": "PASS",
"timestamp": "2026-07-15T10:00:02Z",
"reason": "SUCCESS"
}
]
تاریخچه باید بر اساس زمان اجرا مرتب شود و هر Stage فقط یک بار ثبت شود.
۲۰.۵. Health Check
GET /health
HTTP/1.1 200 OK
{
"status": "UP"
}
۲۱. قالب زمان
تمام Timestampها باید مطابق استاندارد ISO 8601 و در منطقه زمانی UTC باشند:
2026-07-15T10:00:00Z
۲۲. کدهای خطا
سامانه حداقل باید از کدهای زیر استفاده کند:
| کد | توضیح |
|---|---|
INVALID_REQUEST |
JSON نامعتبر است |
LOAN_NOT_FOUND |
شناسه درخواست وجود ندارد |
INVALID_AMOUNT |
مبلغ نامعتبر است |
INVALID_PHONE |
شماره موبایل نامعتبر است |
INVALID_CUSTOMER_ID |
شناسه مشتری نامعتبر است |
INVALID_LOAN_TYPE |
نوع وام نامعتبر است |
INVALID_CREDIT_SCORE |
امتیاز اعتباری نامعتبر است |
INVALID_MONTHLY_INCOME |
درآمد ماهانه نامعتبر است |
۲۳. توسعهپذیری Workflow
فرض کنید بانک در آینده تغییرات زیر را درخواست کند:
- اجرای
AML_CHECKپس ازFRAUD_CHECK؛ - افزودن
LEGAL_CHECKبرای تسهیلاتBUSINESS؛ - اجرای
RISK_SCOREپیش ازCREDIT_CHECK؛ - افزودن نوع جدیدی از تسهیلات؛
- تعریف Workflowهای متفاوت برای بانکها.
پیادهسازی این موارد در نسخه فعلی الزامی نیست، اما افزودن آنها نباید به بازنویسی گسترده منطق اصلی سیستم نیاز داشته باشد.
۲۴. قرارداد Docker
پروژه باید فقط با دستورهای زیر قابل Build و اجرا باشد:
docker build -t bankflow .
docker run -p 8080:8080 bankflow
سرویس باید روی پورت 8080 در دسترس باشد و حداکثر ظرف ۶۰ ثانیه آماده پاسخگویی شود.
۲۵. اقلام قابل تحویل
حداقل ساختار فایلهای تحویلی باید بهشکل زیر باشد:
project/
├── src/
├── Dockerfile
├── README.md
├── DESIGN.md
├── ENGINEERING_DECISIONS.md
└── TESTING.md
در صورت نیاز میتوانید فایلهای تکمیلی دیگری نیز اضافه کنید.
README.md
این فایل مهمترین راهنمای داور برای اجرای پروژه است و باید شامل موارد زیر باشد:
- معرفی کوتاه راهکار؛
- پیشنیازها و وابستگیهای اصلی؛
- روش Build؛
- روش اجرا؛
- روش اجرای تستها؛
- معرفی کوتاه ساختار پروژه؛
- فهرست فناوریهای اصلی.
DESIGN.md
این فایل حداکثر سه صفحه است و باید حداقل موارد زیر را پوشش دهد:
- معماری و اجزای اصلی سیستم؛
- نحوه مدلسازی و اجرای Workflow؛
- نحوه انتخاب مرحله بعد؛
- تغییرات لازم برای افزودن یک Stage جدید؛
- نحوه خواندن قوانین کسبوکار از فایل تنظیمات؛
- نحوه ذخیره اطلاعات و مدیریت وضعیتها؛
- نحوه جلوگیری از پردازش تکراری؛
- تغییرات لازم برای افزودن مرحلهای مانند
AML_CHECK؛ - مهمترین تصمیمها و Trade-offهای طراحی.
ENGINEERING_DECISIONS.md
این فایل حداکثر دو صفحه است و باید حداقل به پرسشهای زیر پاسخ دهد:
- معماری کلی سیستم چیست و چرا انتخاب شده است؟
- چه گزینههای دیگری وجود داشت و چرا انتخاب نشدند؟
- Workflow چگونه مدل شده و افزودن یک مرحله چه بخشهایی را تغییر میدهد؟
- قوانین کسبوکار چگونه از فایل تنظیمات خوانده میشوند؟
- وضعیت فعلی چگونه مدیریت و از اجرای مجدد مراحل جلوگیری میشود؟
- چه مکانیزمی برای ماندگاری اطلاعات انتخاب شده و چرا؟
- سه تصمیم یا Trade-off مهم طراحی چه بودهاند؟
- محدودیت اصلی راهکار چیست؟
- اگر یک هفته زمان بیشتر داشتید، چه بخشهایی را بهبود میدادید؟
- معماری فعلی چگونه از توسعههای آینده پشتیبانی میکند؟
برای هر تصمیم مهم، گزینههای موجود، گزینه انتخابشده، دلیل انتخاب، مزایا و محدودیتها را بیان کنید. هدف این سند نمایش نحوه تفکر و استدلال مهندسی تیم است، نه صرفاً ارائه نمودارهای معماری.
TESTING.md
این فایل حداکثر یک صفحه است و باید توضیح دهد:
- چه تستهایی نوشته شدهاند؛
- چه بخشهایی Unit Test شدهاند؛
- چه بخشهایی Integration Test شدهاند؛
- چه بخشهایی بهدلیل محدودیت زمان تست نشدهاند.
۲۶. نکات پایانی
این چالش بیش از آنکه یک مسئله الگوریتمی باشد، یک مسئله مهندسی نرمافزار است و راهحل یا معماری واحدی ندارد.
شرکتکنندگان باید با تحلیل مسئله، مناسبترین طراحی را انتخاب کنند، تصمیمهای مهندسی خود را مستند سازند و بتوانند در جلسه داوری از آنها دفاع کنند. معیار ارزیابی، کیفیت راهکار است، نه پیچیدگی فناوریهای استفادهشده.