🛠️ Software Engineering Tip of the Day
Design for failure, not perfection. Systems rarely fail the way you expect, so resilience means anticipating breakdowns. Use timeouts, retries, circuit breakers, and graceful degradation to keep your system useful even when parts fail.
Design for failure, not perfection. Systems rarely fail the way you expect, so resilience means anticipating breakdowns. Use timeouts, retries, circuit breakers, and graceful degradation to keep your system useful even when parts fail.
Pseudo-code: Resilient Service Call
function fetchDataWithResilience(serviceEndpoint):
maxRetries = 3
timeout = 2000ms
for attempt in range(1, maxRetries+1):
try:
response = callService(serviceEndpoint, timeout)
if response.isValid():
return response.data
else:
log("Invalid response, attempt " + attempt)
except TimeoutError:
log("Timeout on attempt " + attempt)
except CircuitBreakerOpen:
log("Circuit breaker open, aborting")
return fallbackCacheData()
# Graceful degradation
log("All retries failed, serving cached data")
return fallbackCacheData()یک نمونه circuit breaker
using System;
using System.Threading;
public class CircuitBreaker
{
private enum State { Closed, Open, HalfOpen }
private State _state = State.Closed;
private int _failureCount = 0;
private readonly int _failureThreshold;
private readonly TimeSpan _openTimeout;
private DateTime _lastFailureTime;
public CircuitBreaker(int failureThreshold, TimeSpan openTimeout)
{
_failureThreshold = failureThreshold;
_openTimeout = openTimeout;
}
public T Execute<T>(Func<T> action, Func<T> fallback)
{
switch (_state)
{
case State.Open:
if (DateTime.UtcNow - _lastFailureTime > _openTimeout)
{
_state = State.HalfOpen;
}
else
{
Console.WriteLine("Circuit breaker OPEN: using fallback");
return fallback();
}
break;
}
try
{
T result = action();
Reset();
return result;
}
catch (Exception ex)
{
Console.WriteLine($"Failure: {ex.Message}");
RegisterFailure();
return fallback();
}
}
private void Reset()
{
_failureCount = 0;
_state = State.Closed;
}
private void RegisterFailure()
{
_failureCount++;
_lastFailureTime = DateTime.UtcNow;
if (_failureCount >= _failureThreshold)
{
_state = State.Open;
Console.WriteLine("Circuit breaker TRIPPED: now OPEN");
}
}
}
// Example usage
class Program
{
static void Main()
{
var breaker = new CircuitBreaker(failureThreshold: 3, openTimeout: TimeSpan.FromSeconds(5));
for (int i = 0; i < 10; i++)
{
var result = breaker.Execute(
action: () =>
{
// Simulate failure
if (i % 2 == 0) throw new Exception("Service unavailable");
return "Success";
},
fallback: () => "Fallback data"
);
Console.WriteLine($"Attempt {i}: {result}");
Thread.Sleep(1000);
}
}
}
less moving parts, less failure.
خواجه نصیر طوسی، «دانش» رو از «جدل» به «سنجش» رساند. با ساخت رصدخانهی مراغه، «مشاهده» رو معیار داوری گذاشت. و با نوشتن «اخلاق ناصری» حتی در «اخلاق» هم ساختار رو بر ابهام ترجیح داد.
برای بزرگداشت خواجهنصیر مروری کنیم بر اصلهای مهندسی:
شفافسازی مسئله. ترجیح سادگی بر پیچیدگی. شفاف نگه داشتن ساختار. در نظر داشتن ثابتهایی مثل زمان، هزینه، و انرژی. رعایت ماژولاریتی. انجام طراحیهای سنجش پذیر. آزمونهای بههنگام. داشتن برنامههای خروج و شکست. اتوماتیک کردن کارهای تکراری. ریفکتورهای دائمی و ارتقای ساختار بدون دستکاری رفتار. مستندسازی «چرایی» بیشتر از «چگونگی». حذف کردن پیش از اضافه کردن. گوشه چشم داشتن به تغییرات آینده. تعادل بین تریدآفها و علم به اینکه هیچ بهینهسازی بیهزینه نیست. و در نهایت: ساختن سیستمی که کار میکنه.
برای بزرگداشت خواجهنصیر مروری کنیم بر اصلهای مهندسی:
شفافسازی مسئله. ترجیح سادگی بر پیچیدگی. شفاف نگه داشتن ساختار. در نظر داشتن ثابتهایی مثل زمان، هزینه، و انرژی. رعایت ماژولاریتی. انجام طراحیهای سنجش پذیر. آزمونهای بههنگام. داشتن برنامههای خروج و شکست. اتوماتیک کردن کارهای تکراری. ریفکتورهای دائمی و ارتقای ساختار بدون دستکاری رفتار. مستندسازی «چرایی» بیشتر از «چگونگی». حذف کردن پیش از اضافه کردن. گوشه چشم داشتن به تغییرات آینده. تعادل بین تریدآفها و علم به اینکه هیچ بهینهسازی بیهزینه نیست. و در نهایت: ساختن سیستمی که کار میکنه.
به ازای هر موقعیت شغلی
۱- یه ماشین ویندوزی و یک claude نصب شده
۲- یک
۳- یک آدرس ایمیل لاگین شده
۴- یک اکانت گیتلب شرکت با دسترسی به پروژههای مربوطه
۵- یک اکانت جیرا لاگین شده
۶- تنظیم بشه که هر یک ساعت بره جیرا و ایمیلش رو چک کنه و کارهایی که خواستن رو انجام بده و پوش کنه
۷- بهش ایمیل میزنی و فیچری که میخوای رو بهش میدی
۸- تمام (:
این امن ترین روشه. اگه نخواستی که میشه خیلی صرفه جویانه تر هم پیش رفت.
یه ارتش کامل خواهی داشت که ۲۴ ساعت روز کار میکنن.
تازه میتوانی بگی گزارش هم بدن و یه claude مدیر هم درست کنی که تسک ها رو به اون بدی، اون توزیع کنه ((:
در پر هزینه ترین حالت هزینهی ماهانه هر کدام از این دوستان میشه ۲۵۰ دلار! که بازم از حقوق و دردسرهای یک آدم به مرااااتب کمتره.
۱- یه ماشین ویندوزی و یک claude نصب شده
۲- یک
SKILL.md متناسب با اون موقعیت شغلی۳- یک آدرس ایمیل لاگین شده
۴- یک اکانت گیتلب شرکت با دسترسی به پروژههای مربوطه
۵- یک اکانت جیرا لاگین شده
۶- تنظیم بشه که هر یک ساعت بره جیرا و ایمیلش رو چک کنه و کارهایی که خواستن رو انجام بده و پوش کنه
۷- بهش ایمیل میزنی و فیچری که میخوای رو بهش میدی
۸- تمام (:
این امن ترین روشه. اگه نخواستی که میشه خیلی صرفه جویانه تر هم پیش رفت.
یه ارتش کامل خواهی داشت که ۲۴ ساعت روز کار میکنن.
تازه میتوانی بگی گزارش هم بدن و یه claude مدیر هم درست کنی که تسک ها رو به اون بدی، اون توزیع کنه ((:
در پر هزینه ترین حالت هزینهی ماهانه هر کدام از این دوستان میشه ۲۵۰ دلار! که بازم از حقوق و دردسرهای یک آدم به مرااااتب کمتره.
انقلاب صنعتی چهارم شروع شده.
و از همین ماه، سیل بزرگی از پایان SaaS ها رو شاهد خواهیم بود.
Forwarded from Programmer Jokes
please note: "agile" is a scam. thank you.