برنامه نویسی

پشت تخمین پاکت، شروع مصاحبه طراحی سیستم

Summarize this content to 400 words in Persian Lang
یک مرحله بسیار رایج در فرآیندهای انتخاب برای مهندسان نرم افزار، به ویژه در این دوران پس از همه گیری، مصاحبه طراحی سیستم است. اگر شما یک حرفه ای ارشد یا سطح بالاتر هستید، تقریباً به طور قطع با چالشی از این دست مواجه خواهید شد، و با توجه به اهمیت آن، می خواهم نکاتی را در مورد یکی از اولین گام های مهم برای این مصاحبه ها به اشتراک بگذارم: تخمین های پشت سر هم!

توجه: اگر نمی دانید طراحی سیستم چیست، در اینجا دو وب سایت بسیار جالب برای مطالعه / درک موضوع وجود دارد:

چیست؟ تخمین های پشت پاکت?

به گفته جف دین، عضو ارشد گوگل، در ترجمه رایگان: «تخمین‌های پشت پاکت، تخمین‌هایی هستند که با استفاده از ترکیبی از فرضیه‌ها و اعداد عملکرد رایج خود ایجاد می‌کنید تا درک خوبی از اینکه کدام طرح‌ها نیازهای شما را برآورده می‌کنند، ایجاد می‌کنید. ” .

اساساً، قبل از شروع ساخت/معماری سیستم، ایده آل است که برخی از ظرفیت ها و الزامات عملکرد را برآورد کنیم. این به ما اجازه می دهد تا تصمیمات بهتر و مناسب تری برای سناریوی مورد نظر بگیریم. ما به طور غیررسمی این تخمین ها را “تخمین های پشت سر هم” می نامیم.

توان 2

در دنیای محاسبات ما با بیت ها کار می کنیم، این اصول اولیه است. هنگامی که ما چیزی مانند ذخیره سازی داده را تخمین می زنیم، باید با توان های 2 کار کنیم، زیرا با دنباله ای از بیت ها سر و کار داریم (معمولاً دنباله هایی از بایت ها که 8 بیت هستند). داشتن جدول قدرت های 2 در نوک زبان می تواند کمک زیادی به شما کند:

قدرت
مقدار تقریبی
نام کامل
مخفف

10
1 میل
1 کیلوبایت
1 کیلوبایت

20
1 میلیون
1 مگابایت
1 مگابایت

30
1 میلیارد
1 گیگابایت
1 گیگابایت

40
1 تریلیون
1 ترابایت
1 ترابایت

50
1 کوادریلیون
1 پتابایت
1 PB

علاوه بر این جدول، در نظر گرفتن اندازه انواع داده های ابتدایی برای برآورد نیازهای ذخیره سازی مفید است:

نوع مرگ
اندازه (بایت)

بین المللی
4

شناور
8

بولی
1

کاراکتر UTF-8
1

مهر زمانی یونیکس
4

اعداد تاخیری که هر برنامه نویسی باید بداند

در دنیای محاسبات، تأخیر به طور کلی به مدت زمانی اطلاق می‌شود که برای اجرای یک عمل خاص طول می‌کشد، یعنی در یک زمینه شبکه، تأخیر می‌تواند به مدت زمانی که طول می‌کشد تا یک بسته از گره A به گره B برود اشاره داشته باشد. ، در زمینه ذخیره سازی، تأخیر می تواند به مدت زمانی که دیسک برای نوشتن اطلاعات X یا خواندن همان اطلاعات طول می کشد اشاره کند. در زمینه یک پایگاه داده، تأخیر می تواند به مدت زمانی که طول می کشد تا یک کوئری اجرا شود و نتیجه آن را برگرداند و غیره اشاره کند.

در این زمینه تأخیر، دکتر جف دین اعداد مهمی را فهرست می کند که باید به خاطر داشته باشید:

نام عملیات
تأخیر

مرجع حافظه نهان L1
0.5 ns

شعبه اشتباه پیش بینی می کند
5 ns

مرجع حافظه نهان L2
7 ns

قفل/باز کردن قفل Mutex
100 ns

مرجع حافظه اصلی
100 ns

1K بایت را با Zippy فشرده کنید
10000 ns = 10 میکرو ثانیه

ارسال 2K بایت از طریق شبکه 1 گیگابیت بر ثانیه
20000 ns = 20 میکروثانیه

1 مگابایت را به صورت متوالی از حافظه بخوانید
250000 ns = 250 میکروثانیه

رفت و برگشت در همان دیتاسنتر
500000 ns = 500 میکروثانیه

جستجوی دیسک
10,000,000 ns = 10 ms

1 مگابایت را به صورت متوالی از شبکه بخوانید
10,000,000 ns = 10 ms

خواندن 1 مگابایت متوالی از دیسک
30,000,000 ns = 30 ms

ارسال بسته CA (کالیفرنیا) -> هلند-> CA
150,000,000 ns = 150 ms

اولین سلب مسئولیت در مورد این جدول این است که اعداد قطعاً منسوخ شده اند، زیرا رایانه ها دائماً تکامل می یابند و سریعتر و قدرتمندتر می شوند، با این حال، ما هیچ تعهدی نداریم که از این جدول برای تخمین های پشتیبان استفاده کنیم، زیرا در حال کار با موارد بسیار ابتدایی و ابتدایی هستیم. تخمین های تقریبی، که در مصاحبه های طراحی سیستم استفاده خواهد شد.

ایده این است که یک حس مرتبه بزرگی داشته باشیم و نه اعداد دقیق.

تفسیر اعداد

از این داده‌ها، می‌توانیم نتایج ارزشمندی را برای طرح‌های خود استخراج کنیم:

تفاوت بزرگی قابل توجهی بین عملیات های مختلف وجود دارد (به عنوان مثال خواندن داده ها از شبکه / دیسک در مقابل خواندن داده ها از حافظه)
دیتاسنترها اغلب بسیار دور از یکدیگر قرار دارند و ترافیک داده بین آنها پرهزینه است.
با استفاده از یک الگوریتم فشرده سازی ساده می توانیم پهنای باند زیادی را در ترافیک شبکه ذخیره کنیم
سرعت نوشتن 40 برابر کندتر از خواندن است
داده‌های جهانی مشترک گران است، این یک محدودیت اساسی برای سیستم‌های توزیع‌شده است، نگه داشتن قفل روی اشیایی که زیاد نوشته می‌شوند منجر به از بین رفتن عملکرد سیستم می‌شود، زیرا ما نیاز به اجرای تراکنش‌های سریالی داریم (یک در یک زمان)
معماری خود را در مقیاس نوشتاری طراحی کنید، زیرا اینها پرهزینه ترین عملیات هستند
سیستم خود را برای به حداقل رساندن قفل نوشتن بهینه کنید، اطمینان حاصل کنید که داده ها می توانند به طور همزمان بدون قفل نوشته شوند.
سیستم خود را برای موازی سازی بهینه کنید، یعنی اطمینان حاصل کنید که نوشته ها می توانند به صورت موازی در صورت امکان اجرا شوند.

شماره های موجود

در دسترس بودن معیاری است که نشان می دهد چه مدت یک سیستم در یک دوره معین آنلاین و پاسخگو است. به طور معمول، در دسترس بودن به عنوان درصد بیان می شود، که در آن 100٪ به این معنی است که سیستم در کل زمان تجزیه و تحلیل در دسترس بوده است. اکثر سیستم ها در دسترس بودن را بین 99% تا 100% قابل قبول می دانند.

اصطلاحی که اغلب در زمینه در دسترس بودن استفاده می شود SLA (توافقنامه سطح خدمات) است که ارزشی است که در قرارداد در مورد در دسترس بودن یک سرویس توافق شده است. SLA ها اغلب با “اعداد 9” بیان می شوند که تعداد 9 ها را بعد از کاما (اعشار) نشان می دهد.

جدول زیر مقادیر تقریبی SLA را برای دوره های زمانی مختلف بیان می کند:

در دسترس بودن %
توقف در روز
تعطیلی در هفته
توقف در ماه
خرابی در سال

99%
14.40 دقیقه
1.68 ساعت
7.31 ساعت
3.65 دیاس

99.99٪
8.64 ثانیه
1.01 دقیقه
4.38 دقیقه
52.60 دقیقه

99.999٪
864.00 میلی ثانیه
6.05 ثانیه
26.30 ثانیه
5.26 دقیقه

99.9999%
86.40 میلی ثانیه
604.80 میلی ثانیه
2.63 ثانیه
31.56 ثانیه

نمونه عملی تحلیل

تصور کنید که باید یک صفحه نتایج جستجو با 30 تصویر کوچک (تصویر) ایجاد کنید، تجزیه و تحلیل عملکرد این نیاز چگونه خواهد بود؟

Proposta 1 – Design Serial

در این پیشنهاد ما تصاویر دیسک را به صورت متوالی (یکی پس از دیگری) خواهیم خواند.

حساب عملکرد خواهد بود:

30

توضیح حساب:

از آنجایی که 30 تصویر کوچک وجود دارد، مدت زمان خواندن هر تصویر کوچک را در 30 ضرب می کنیم.

هر تصویر کوچک برای خواندن از دیسک به اضافه زمان لازم برای انتقال این داده ها از دیسک به حافظه زمان می برد، هر دو مقدار در جداول بالا آمده است، اما برای مرجع، 10 میلی ثانیه در خواندن دیسک و 30 میلی ثانیه بر مگابایت انتقال داده می شود.

علاوه بر اعداد در جدول، تخمین می زنیم که هر تصویر کوچک 256 کیلوبایت (یا 0.256 مگابایت) اندازه دارد.

با حل معادله، به عدد 530 میلی‌ثانیه به عنوان تخمین برای تولید صفحه، تنها با در نظر گرفتن خواندن ریز عکس‌ها، می‌رسیم.

پیشنهاد 2 – طراحی موازی

در این پیشنهاد، خواندن دیسک به صورت موازی انجام می شود، به عنوان مثال، از رشته های مختلف برای خواندن همزمان از دیسک استفاده می شود.

حساب این خواهد بود:

10 میلی‌ثانیه / خواندن دیسک + 0.256 مگابایت * 30 میلی‌ثانیه / مگابایت = 18 میلی‌ثانیه

توضیح حساب:

در اینجا، محاسبه مشابه با طراحی متوالی است، اما ما نتیجه را در 30 ضرب نمی کنیم، زیرا خواندن به صورت موازی انجام می شود.

برای واقعی‌تر کردن سناریو، می‌توانیم چند میلی‌ثانیه برای همگام‌سازی رشته و تغییر در خواندن دیسک اضافه کنیم، جایی که چیزی بین 30 تا 60 میلی‌ثانیه خواهیم داشت، باز هم بسیار سریع‌تر از طراحی سریال، که قدرت موازی‌سازی را نشان می‌دهد!

تجزیه و تحلیل پیشنهادات

کدام سناریو بهتر است؟

پاسخ به این سوال به هر مورد و الزامات آن بستگی دارد، با این حال، با داشتن تخمین‌هایی از هر طرح، می‌توانیم آنها را با قاطعیت‌تر مقایسه کنیم و یکی را انتخاب کنیم که عملکرد بهتری ارائه می‌دهد و از برآورده شدن الزامات اطمینان حاصل می‌کند.

نکته مهم این است که شما اکنون پایه محکمی برای مقایسه دارید که به شما امکان می دهد به سوالاتی که ممکن است در طول جلسه وایت برد یا مصاحبه طراحی سیستم ایجاد شود با دقت بیشتری پاسخ دهید و از اعداد سخت برای اطلاع از تصمیمات خود استفاده کنید.

نتیجه گیری

تخمین پشت پاکت تکنیکی است که به ما کمک می‌کند تا دیدی جامع‌تر و مبتنی بر اعداد از طرح‌ها و راه‌حل‌های مختلف داشته باشیم، که ابزار مهمی در هنگام طراحی یک سیستم است.

اعداد اولیه عملکرد و ذخیره سازی قطعات مرتبط مورد استفاده در سیستم های خود را در دسترس داشته باشید، دانستن این اعداد از قبل، قبل از جلسات وایت برد / مصاحبه های طراحی سیستم، به تخمین های دقیق تر کمک می کند، زیرا تخمین درست بدون پایگاه اطلاعاتی غیرممکن است.

علاوه بر این، نظارت و اندازه‌گیری دوره‌ای سیستم‌های شما تضمین می‌کند که این تخمین‌ها دقیق‌تر می‌شوند، زیرا از داده‌های واقعی و خاص از اجزای سیستم خود استفاده خواهید کرد. این نه تنها کیفیت تخمین ها را بهبود می بخشد، بلکه توانایی شما را برای تصمیم گیری آگاهانه و موثر تقویت می کند.

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

توجه: اگر نمی دانید طراحی سیستم چیست، در اینجا دو وب سایت بسیار جالب برای مطالعه / درک موضوع وجود دارد:

چیست؟ تخمین های پشت پاکت?

به گفته جف دین، عضو ارشد گوگل، در ترجمه رایگان: «تخمین‌های پشت پاکت، تخمین‌هایی هستند که با استفاده از ترکیبی از فرضیه‌ها و اعداد عملکرد رایج خود ایجاد می‌کنید تا درک خوبی از اینکه کدام طرح‌ها نیازهای شما را برآورده می‌کنند، ایجاد می‌کنید. ” .

اساساً، قبل از شروع ساخت/معماری سیستم، ایده آل است که برخی از ظرفیت ها و الزامات عملکرد را برآورد کنیم. این به ما اجازه می دهد تا تصمیمات بهتر و مناسب تری برای سناریوی مورد نظر بگیریم. ما به طور غیررسمی این تخمین ها را “تخمین های پشت سر هم” می نامیم.

توان 2

در دنیای محاسبات ما با بیت ها کار می کنیم، این اصول اولیه است. هنگامی که ما چیزی مانند ذخیره سازی داده را تخمین می زنیم، باید با توان های 2 کار کنیم، زیرا با دنباله ای از بیت ها سر و کار داریم (معمولاً دنباله هایی از بایت ها که 8 بیت هستند). داشتن جدول قدرت های 2 در نوک زبان می تواند کمک زیادی به شما کند:

قدرت مقدار تقریبی نام کامل مخفف
10 1 میل 1 کیلوبایت 1 کیلوبایت
20 1 میلیون 1 مگابایت 1 مگابایت
30 1 میلیارد 1 گیگابایت 1 گیگابایت
40 1 تریلیون 1 ترابایت 1 ترابایت
50 1 کوادریلیون 1 پتابایت 1 PB

علاوه بر این جدول، در نظر گرفتن اندازه انواع داده های ابتدایی برای برآورد نیازهای ذخیره سازی مفید است:

نوع مرگ اندازه (بایت)
بین المللی 4
شناور 8
بولی 1
کاراکتر UTF-8 1
مهر زمانی یونیکس 4

اعداد تاخیری که هر برنامه نویسی باید بداند

در دنیای محاسبات، تأخیر به طور کلی به مدت زمانی اطلاق می‌شود که برای اجرای یک عمل خاص طول می‌کشد، یعنی در یک زمینه شبکه، تأخیر می‌تواند به مدت زمانی که طول می‌کشد تا یک بسته از گره A به گره B برود اشاره داشته باشد. ، در زمینه ذخیره سازی، تأخیر می تواند به مدت زمانی که دیسک برای نوشتن اطلاعات X یا خواندن همان اطلاعات طول می کشد اشاره کند. در زمینه یک پایگاه داده، تأخیر می تواند به مدت زمانی که طول می کشد تا یک کوئری اجرا شود و نتیجه آن را برگرداند و غیره اشاره کند.

در این زمینه تأخیر، دکتر جف دین اعداد مهمی را فهرست می کند که باید به خاطر داشته باشید:

نام عملیات تأخیر
مرجع حافظه نهان L1 0.5 ns
شعبه اشتباه پیش بینی می کند 5 ns
مرجع حافظه نهان L2 7 ns
قفل/باز کردن قفل Mutex 100 ns
مرجع حافظه اصلی 100 ns
1K بایت را با Zippy فشرده کنید 10000 ns = 10 میکرو ثانیه
ارسال 2K بایت از طریق شبکه 1 گیگابیت بر ثانیه 20000 ns = 20 میکروثانیه
1 مگابایت را به صورت متوالی از حافظه بخوانید 250000 ns = 250 میکروثانیه
رفت و برگشت در همان دیتاسنتر 500000 ns = 500 میکروثانیه
جستجوی دیسک 10,000,000 ns = 10 ms
1 مگابایت را به صورت متوالی از شبکه بخوانید 10,000,000 ns = 10 ms
خواندن 1 مگابایت متوالی از دیسک 30,000,000 ns = 30 ms
ارسال بسته CA (کالیفرنیا) -> هلند-> CA 150,000,000 ns = 150 ms

اولین سلب مسئولیت در مورد این جدول این است که اعداد قطعاً منسوخ شده اند، زیرا رایانه ها دائماً تکامل می یابند و سریعتر و قدرتمندتر می شوند، با این حال، ما هیچ تعهدی نداریم که از این جدول برای تخمین های پشتیبان استفاده کنیم، زیرا در حال کار با موارد بسیار ابتدایی و ابتدایی هستیم. تخمین های تقریبی، که در مصاحبه های طراحی سیستم استفاده خواهد شد.

ایده این است که یک حس مرتبه بزرگی داشته باشیم و نه اعداد دقیق.

تفسیر اعداد

از این داده‌ها، می‌توانیم نتایج ارزشمندی را برای طرح‌های خود استخراج کنیم:

  • تفاوت بزرگی قابل توجهی بین عملیات های مختلف وجود دارد (به عنوان مثال خواندن داده ها از شبکه / دیسک در مقابل خواندن داده ها از حافظه)
  • دیتاسنترها اغلب بسیار دور از یکدیگر قرار دارند و ترافیک داده بین آنها پرهزینه است.
  • با استفاده از یک الگوریتم فشرده سازی ساده می توانیم پهنای باند زیادی را در ترافیک شبکه ذخیره کنیم
  • سرعت نوشتن 40 برابر کندتر از خواندن است
  • داده‌های جهانی مشترک گران است، این یک محدودیت اساسی برای سیستم‌های توزیع‌شده است، نگه داشتن قفل روی اشیایی که زیاد نوشته می‌شوند منجر به از بین رفتن عملکرد سیستم می‌شود، زیرا ما نیاز به اجرای تراکنش‌های سریالی داریم (یک در یک زمان)
  • معماری خود را در مقیاس نوشتاری طراحی کنید، زیرا اینها پرهزینه ترین عملیات هستند
  • سیستم خود را برای به حداقل رساندن قفل نوشتن بهینه کنید، اطمینان حاصل کنید که داده ها می توانند به طور همزمان بدون قفل نوشته شوند.
  • سیستم خود را برای موازی سازی بهینه کنید، یعنی اطمینان حاصل کنید که نوشته ها می توانند به صورت موازی در صورت امکان اجرا شوند.

شماره های موجود

در دسترس بودن معیاری است که نشان می دهد چه مدت یک سیستم در یک دوره معین آنلاین و پاسخگو است. به طور معمول، در دسترس بودن به عنوان درصد بیان می شود، که در آن 100٪ به این معنی است که سیستم در کل زمان تجزیه و تحلیل در دسترس بوده است. اکثر سیستم ها در دسترس بودن را بین 99% تا 100% قابل قبول می دانند.

اصطلاحی که اغلب در زمینه در دسترس بودن استفاده می شود SLA (توافقنامه سطح خدمات) است که ارزشی است که در قرارداد در مورد در دسترس بودن یک سرویس توافق شده است. SLA ها اغلب با “اعداد 9” بیان می شوند که تعداد 9 ها را بعد از کاما (اعشار) نشان می دهد.

جدول زیر مقادیر تقریبی SLA را برای دوره های زمانی مختلف بیان می کند:

در دسترس بودن % توقف در روز تعطیلی در هفته توقف در ماه خرابی در سال
99% 14.40 دقیقه 1.68 ساعت 7.31 ساعت 3.65 دیاس
99.99٪ 8.64 ثانیه 1.01 دقیقه 4.38 دقیقه 52.60 دقیقه
99.999٪ 864.00 میلی ثانیه 6.05 ثانیه 26.30 ثانیه 5.26 دقیقه
99.9999% 86.40 میلی ثانیه 604.80 میلی ثانیه 2.63 ثانیه 31.56 ثانیه

نمونه عملی تحلیل

تصور کنید که باید یک صفحه نتایج جستجو با 30 تصویر کوچک (تصویر) ایجاد کنید، تجزیه و تحلیل عملکرد این نیاز چگونه خواهد بود؟

Proposta 1 – Design Serial

در این پیشنهاد ما تصاویر دیسک را به صورت متوالی (یکی پس از دیگری) خواهیم خواند.

حساب عملکرد خواهد بود:

30

توضیح حساب:

از آنجایی که 30 تصویر کوچک وجود دارد، مدت زمان خواندن هر تصویر کوچک را در 30 ضرب می کنیم.

هر تصویر کوچک برای خواندن از دیسک به اضافه زمان لازم برای انتقال این داده ها از دیسک به حافظه زمان می برد، هر دو مقدار در جداول بالا آمده است، اما برای مرجع، 10 میلی ثانیه در خواندن دیسک و 30 میلی ثانیه بر مگابایت انتقال داده می شود.

علاوه بر اعداد در جدول، تخمین می زنیم که هر تصویر کوچک 256 کیلوبایت (یا 0.256 مگابایت) اندازه دارد.

با حل معادله، به عدد 530 میلی‌ثانیه به عنوان تخمین برای تولید صفحه، تنها با در نظر گرفتن خواندن ریز عکس‌ها، می‌رسیم.

پیشنهاد 2 – طراحی موازی

در این پیشنهاد، خواندن دیسک به صورت موازی انجام می شود، به عنوان مثال، از رشته های مختلف برای خواندن همزمان از دیسک استفاده می شود.

حساب این خواهد بود:

10 میلی‌ثانیه / خواندن دیسک + 0.256 مگابایت * 30 میلی‌ثانیه / مگابایت = 18 میلی‌ثانیه

توضیح حساب:

در اینجا، محاسبه مشابه با طراحی متوالی است، اما ما نتیجه را در 30 ضرب نمی کنیم، زیرا خواندن به صورت موازی انجام می شود.

برای واقعی‌تر کردن سناریو، می‌توانیم چند میلی‌ثانیه برای همگام‌سازی رشته و تغییر در خواندن دیسک اضافه کنیم، جایی که چیزی بین 30 تا 60 میلی‌ثانیه خواهیم داشت، باز هم بسیار سریع‌تر از طراحی سریال، که قدرت موازی‌سازی را نشان می‌دهد!

تجزیه و تحلیل پیشنهادات

کدام سناریو بهتر است؟

پاسخ به این سوال به هر مورد و الزامات آن بستگی دارد، با این حال، با داشتن تخمین‌هایی از هر طرح، می‌توانیم آنها را با قاطعیت‌تر مقایسه کنیم و یکی را انتخاب کنیم که عملکرد بهتری ارائه می‌دهد و از برآورده شدن الزامات اطمینان حاصل می‌کند.

نکته مهم این است که شما اکنون پایه محکمی برای مقایسه دارید که به شما امکان می دهد به سوالاتی که ممکن است در طول جلسه وایت برد یا مصاحبه طراحی سیستم ایجاد شود با دقت بیشتری پاسخ دهید و از اعداد سخت برای اطلاع از تصمیمات خود استفاده کنید.

نتیجه گیری

تخمین پشت پاکت تکنیکی است که به ما کمک می‌کند تا دیدی جامع‌تر و مبتنی بر اعداد از طرح‌ها و راه‌حل‌های مختلف داشته باشیم، که ابزار مهمی در هنگام طراحی یک سیستم است.

اعداد اولیه عملکرد و ذخیره سازی قطعات مرتبط مورد استفاده در سیستم های خود را در دسترس داشته باشید، دانستن این اعداد از قبل، قبل از جلسات وایت برد / مصاحبه های طراحی سیستم، به تخمین های دقیق تر کمک می کند، زیرا تخمین درست بدون پایگاه اطلاعاتی غیرممکن است.

علاوه بر این، نظارت و اندازه‌گیری دوره‌ای سیستم‌های شما تضمین می‌کند که این تخمین‌ها دقیق‌تر می‌شوند، زیرا از داده‌های واقعی و خاص از اجزای سیستم خود استفاده خواهید کرد. این نه تنها کیفیت تخمین ها را بهبود می بخشد، بلکه توانایی شما را برای تصمیم گیری آگاهانه و موثر تقویت می کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا