تاریخچه مصطفی
احتمالن بپرسه از خودت یکم بگو ، به نظرم اینا خوبه :
دانشجویه سال ۹۴ بودم (علوم کامپیوتر دانشگاه سراسری سمنان)
اولاش با php laravel شروع کردم ولی افتادم توی جنگو
دیگه با جنگو خیلی کار می کردم و توی دوران دانشجویی (در ترمای آخر) یه سایت ms رو زدم ،
اون زمان دنبال فول استک شدن و کار با بک اند و تمپلیت زدن تو جنگو و این که هاست و دامین و سرور رو دست بگیریم و توی گوگل کانسول تعداد بازدید و ادمین پنل جنگو رو کاستوم کنیم و و orm های خفن بزنیم و در سقف رو جایی میدیدم که پروژه فول استک بگیرم انجام بدم
بعد اتمام دانشگاه رفتن توی شرکت های enterprise کم کم به جای تمپلیت جنگو یاد گرفتیم با api کار کنیم و ازvuejs بعد یه سال کار تو این شرکت سر و صدای میکرو سرویس و تب و تاب یادگیری tools` های خفن زیاد شد
توی اون زمانا هم خیلی علاقه یاد گفتن و کار کردن با این ابزار ها تو مون زیاد شد
از طرفی متقاعد میکردیم مدیرمون رو که جنگوی مونولیتیک رو ببریم سمت میکروسرویس
اولا خیلی ناشیانه با nameko و rpc با تحقیق و اومدیم یه افتضاحی رو بالا اورده بودیم ، فک می کردیم میکرو سرویس یعنی حتی فانکشنابیتی هم باید جدا شه :)
دیگه کم کم داشتیم سقف خودمون رو software enginier میدیدیم و بر این باور بودیم که زبون مهم نیست و چجوری کلین کد بزنیم و …
بعدش زبون گو رو یاد گرفتیم و بعضی از دوستان که علاقه به زیر ساخت داشتن رفتن سمت gateway = api6 , auth keyclock kong یه سری از بچه ها هم سمت کوبرنتیز و و …
ما هم سمت با تجربه های افتضاحمون رفتیم سمت کافکا و grpc و الستیک و
شرکت اجازه میداد خودمون کار کنیم و Site reliability engineering هم به خودمون میداد
بعد از اون تایم من اومدم حصین شرکت تو حوزه ی مالی کار میکرد ، اصلن اجازه ی افزودن استک نمی کرد
دسترسی حتی به دیتا بیس های محیط dev هم نداشتیم ، پر و بالمون بسته شد ولی خب یاد گرفتیم همه چی رو لاگ کنیم ، یاد گرفتیم خیلی خیلی استاندارد کار کردنو
یاد گرفتیم چجوری legacy code رو کم کم حذف کنیم و سرویس های کوچیک از توش در بیاریم
این که پروایدرا چگونه مستندشونو بخونیم ، بتونیم با توجه به source of truth بودن اون ها خوپمون رو در صورت down محدود به اونا نکنیم به این صورت که ما تیبل های خودمون رو خودمون طراحی کنیم با توجه به دیدن حداقل ۲ تا پروایدر و پروایدر در حد یه کالمن باشه ، اینکه تمام درخواست های http سمت پروایدر باید لاگ بشه داده ها برای مانیتور چجوری سریال بشه
این که اگر اپلیکیشن موبایل داریم داریم چقد سخته فورس آپدیت دادن و پس استیت ها و flow managment رو از تو موبایل در بیاریم ، مراحل رو داینامیک کنیم و نیازی نبینیم که با هر آپدیت فرانت و بک اند نیاز به فورس اپدیت موبایل باشه
اگر یه زمانی هدف فول استک بود ، بعدش شد یاد گیری همه ی ابزار ها و بعد سافت ور انجین ، الان به این رسیدم که باید ارزش تولید شه و impact محور باشم
در حال حاضر تیم لید گولنگ هشتم و مدیرمون هر هفته جلسه ی 1 به 1 برگزار می کنه و نکات لیدرشیپ شدن میگه
فنی
سوالات فنی
- اگر کد گولنگ زدیم ، مموری پرشد ، دسترسی به htop نداشتیم و روی پروداکت بود ، از کجا میفهمیم مشکل کجاست
- استفاده از pprof در گولنگ
متاسفانه سوالاتی که مثل خر تو گل می مونم بحث لود کار و پیدا کردن باتل نک و دلیل کند شدن سیستم هست
چه گولنگ و چه پستگرس همیشه سوالات پیستگرسی رو خیلی خیلی افتضاح پاسخ میدم
این که یه کوییری پیچیده میدن و من میرینم و این که میگن سرعت اومده وایین چجوری می خوای پیدا کنی مشکل رو
البته برای کد گولنگ و این که چجوری مموری لیک رو پیدا میکنی بدون دسترسی به لاک و دسترسی به پاد ها
-
تو ۷۸۰ تو بحث ساگا پرسید اگه سومین سرویس ما تو بحث
distribiuted transactionها پروایدر بیرونی باشه و جواب تایم اوت بخوره چی میشه ؟ -
همچنین توی اسنپ پرسید کامینیکیشن بین
coreو سایر سیستم ها باید سینک باشه یا آسینک
ولی جان جدت یا پستگرس رو وردار از رزومت یا بشین موارد بالا رو هر ار بخون
انسانی
-
حتما درباره ی soft skill صحبت شه ، بگیم که شرکت و دوست داریم ، بگیم نمیزارم جو سمی شه ، میفهمم trade of کد کامپلکس و راحتی رو
-
تعریف از لیدر و اطاعت
-
این که هر وقت همه می خوان برن یا مهاجرت یا از شرکت ، من پایبند شرکتم و احترام میزارم به سرمایه گذار
-
این که سعی کنی جو سمی محیط و بدبینی نسبت به مدیر یا شرکت رو کم کنی و جمع رو همراه خوت کنی برای مثال : اگه بچه ها همش میرن روف گاردن استراحت ، به جای اینکه نری و کار کنی ، بری و بعد ۱۰دقیقه استراحت بگی من برم ادامه کار
-
زمانی که بیزینس تصمیم به کوچکتر کردن تیم گرفت ، تنها نیروی تیم ، من بودن و نگه داشتن و افزایشم ۶۲ درصدی لحاظ شد وحتی تیم منابع و مدیریت رو راضی کردم که یکی از همکاران رو حفظ کنن

سوالاتی که باید بپرسیم
انسانی
تو بچه های قدیمی ، چند سال موندن و چه درجه ای دارن؟
میانگین حضور برنامه نویس ، میزان اخراج از سمت شرکت هم زمان تستی هم تمام وقت ، سنوات و عیدی با حقوق پایه؟
تامین اجتماعی ، مرخصی ، استعلاجی ، تاریخ دقیق هر ماه حقوق پرسیده شه
فنی
چند تا نیروی گولنگ کار هست ، چند اسکواود؟
استکا چیان؟ - Devops از چه tools هایی استفاده میکنه؟ -
احتمال داره من رو توی devops بازی بدن؟ یا توی تحلیل نیازمندی؟
اگر من بیام آیا اسکوادم؟ یا تیمم مشخصه؟ و اگر هست الان چالش ها و تسکاش چیه؟
- website Pramp or Interviewing.io
واژگان تککلمهای (با توضیح کوتاه)
trade-off — «تبادل» بین دو مزیت/محدودیت (مثال: trade-off بین سرعت و حافظه)
performance — کارایی/عملکرد
latency — تأخیر (زمان پاسخ)
throughput — توان عملیاتی (درخواست/ثانیه)
scalability — مقیاسپذیری
amortized — هزینهی متوسط در طول زمان (amortized cost)
concurrency — همروندی (همزمانی)
parallelism — موازیسازی
bottleneck — گلوگاه
profiling — پروفایلگیری (برای پیدا کردن نقاط کند)
benchmarking — ارزیابی عملکرد با معیارها
optimization — بهینهسازی
refactor — بازسازی کد بدون تغییر رفتار
regression — برگشت خطا (بعد از تغییر کد)
idempotent — انجام چندباره بدون تغییر نتیجهٔ بیش از بار اول
immutable / immutability — تغییرناپذیریِ داده
memoization — ذخیره نتیجهٔ محاسبات برای عدم تکرار
heap / stack — انواع حافظه/فضاها در برنامه
memory leak — نشت حافظه
garbage collection — جمعآوری زباله (حذف حافظهٔ غیرقابلاستفاده)
deadlock — بنبست در قفلها
mutex / semaphore — قفلها/سینکرونایزرها
lock-free — بدون قفل (الگوریتمهای همروندی)
serialization / deserialization — سریالسازی/دِسریالسازی
sharding — تقسیمبندی دادهها بین نودها
partitioning — پارتیشنیگ (همین مفهوم در دیتابیس/پیام)
consistency / eventual consistency — سازگاری/سازگاری نهایی
consensus (Raft / Paxos) — الگوریتم اجماع بین نودها
leader election — انتخاب رهبر در سیستم توزیعشده
snapshotting — گرفتن عکس/حالت از داده برای بکاپ یا recovery
rollback — بازگردانی تراکنش/نسخه
ACID — خواص تراکنش (Atomicity, Consistency, Isolation, Durability)
CAP theorem — تئوری تناقض بین Consistency, Availability, Partition tolerance
CQRS — Command Query Responsibility Segregation
microservices — معماری میکروسرویسها
monolith — اپلیکیشن یکپارچه
polyglot persistence — استفاده از دیتاستهای متفاوت برای نیازهای متفاوت
CI/CD — تحویل و توسعهٔ پیوسته
canary release / blue-green deployment — استراتژیهای انتشار امن
feature flag — فلگ ویژگی برای فعال/غیرفعال کردن قابلیتها
A/B testing — آزمایش مقایسهای برای ویژگیها
rate limiting / throttling — محدودسازی نرخ درخواست
circuit breaker — الگوی مقاوم در برابر شکست سرویسها
backpressure — بازگرداندن فشار وقتی مصرفکننده کندتر است
exponential backoff — افزایش زمان تلاش مجدد به صورت نمایی
debounce / throttle — کنترل فراوانی اجرای توابع (در UI/رویدادها)
hot path / cold path — مسیرهای پردازشی پرتکرار یا کمکاربرد
cold start / warmup — زمان شروع سرویس (مخصوصاً در سرورلس)
observability / telemetry — دیدهپذیری؛ لاگ، متریک، تریسینگ
instrumentation — درج متریک/لاگ برای مانیتورینگ
SLO / SLA / KPI / OKR — اهداف/معیارهای سرویس و تیم
MTTR / MTTF — میانگین زمان بازیابی / میانگین زمان کارکرد تا خرابی
tech debt — بدهی فنی
legacy code — کد قدیمی/مانده
code smell — بو/نشانهٔ طراحی ضعیف
SOLID / DRY / KISS / YAGNI — اصول طراحی نرمافزار
عبارات کوتاه و برجسته (پاراگرافهای نمونه برای استفاده)
«ما اینجا بین latency و throughput یه trade-off داریم.»
«برای کاهش latency، میتونه کش اضافه کنیم ولی باید cache invalidation رو مدیریت کنیم.»
«قبل از بهینهسازی، بهتره با profiling مشخص کنیم که hot path کجاست.»
«پیشنهاد میکنم این تغییر رو بهصورت canary release منتشر کنیم تا ریسک رو کم کنیم.»
«اگه مقیاس زیادی نیاز داریم، باید sharding یا partitioning رو در نظر بگیریم.»
«این API باید idempotent باشه تا مشکلات retry رو حل کنه.»
«برای تحمل خطا بهتر، از circuit breaker و exponential backoff استفاده کنیم.»
«این مسئله مال tech debt هست؛ refactor کوتاهمدت ارزش ROI داره.»
«با observability درست — یعنی logs، metrics و traces — میتونیم MTTR رو پایین بیاریم.»
«این سرویس الان monolith هست؛ مهاجرت به microservices یه trade-off بین سرعت توسعه و پیچیدگی عملیاتیه.»
چند جملهٔ کوتاه برای مصاحبه
«من معمولاً قبل از هر تغییر بزرگ، یک benchmark میگیرم و بعد با profiling شروع به optimization میکنم.»
«در پروژه قبلی با استفاده از feature flags تونستیم rollout رو کنترل کنیم و regressionها رو به صفر نزدیک کنیم.»
«وقتی سیستم توزیعشده دارید، CAP theorem رو همیشه توی تصمیمگیریها مدنظر میذارم.»
«برای cache invalidation روش مناسب انتخاب کردم چون بدون اون stale data داشتیم.»
«برای concurrency از الگوریتمهای lock-free استفاده کردیم تا contention رو کم کنیم.»
توصیهٔ حرفهای (نحوهی استفاده درست)
از این کلمات فقط برای «نمایش» استفاده نکن — باید معنیشون رو بدونی.
وقتی واژهای میگی، سریع یک خط توضیح یا مثال واقعی بذار؛ این توابع رو معتبر نشان میده.
هر جا ممکنه عدد/مقدار بیاری: «latency از 200ms شد 50ms» — اثرگذاری بیشتر میشه.
از buzzwordهای کلی (مثلاً فقط «optimize») بدون شرح بیشتر پرهیز کن.
time complexity
- O(n)
در کد زیر چون حلقه یک بار تا ته باید طی شه ، به اندازه طول حلقه است
package main
import "fmt"
// Function to find the maximum value in a slice
func findMax(nums []int) int {
if len(nums) == 0 {
return -1 // or handle empty slice case
}
max := nums[0]
for i := 1; i < len(nums); i++ {
if nums[i] > max {
max = nums[i]
}
}
return max
}
func main() {
nums := []int{3, 5, 7, 2, 8, 9, 1}
fmt.Println("Max:", findMax(nums))
}- Bubble Sort O(n²)
func bubbleSort(arr []int) {
n := len(arr)
for i := 0; i < n-1; i++ {
for j := 0; j < n-i-1; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
}- Merge Sort O(n log n)
func mergeSort(arr []int) []int {
if len(arr) < 2 {
return arr
}
mid := len(arr) / 2
left := mergeSort(arr[:mid])
right := mergeSort(arr[mid:])
return merge(left, right)
}
func merge(left, right []int) []int {
result := []int{}
i, j := 0, 0
for i < len(left) && j < len(right) {
if left[i] < right[j] {
result = append(result, left[i])
i++
} else {
result = append(result, right[j])
j++
}
}
result = append(result, left[i:]...)
result = append(result, right[j:]...)
return result
}
- Binary Search O(log n)
func binarySearch(arr []int, target int) int {
low, high := 0, len(arr)-1
for low <= high {
mid := (low + high) / 2
if arr[mid] == target {
return mid
} else if arr[mid] < target {
low = mid + 1
} else {
high = mid - 1
}
}
return -1 // Target not found
}
tips
- اگر حلقه نیاز بود ، حتما قبلش یه temp تعریف کن و روی اون ایتریت بکن
- اگر به نظرت اومد ریسیور نیازه با دقت کامل رو استراکتا بزن ، همیشه یه استراکت لیست هست و یه استراکت آیتم ، باید روی لیست ریسیور اضافه و حذف زد
یه جورایی میشه گفت فیلد ها در استراکت نقش حافظه دارند و ذخیره میکنند ، اما ریسیور ها چیزی ذخیره نمی کنن ولی فانکشنالیتی رو انجام میدن
همیشه ریسیور ها پوینتری باشند تا بتونن رو فیلد ها تغییرات ایجاد کنند
قبل مصاحبه حتما crud آرایه ، اسلایس استراک ، مپ
-
حتما از debugger استفاده کنیم
-
باید فانکشنالیتی در یک فانکشن جدا بشد و در نهایت در main مقدار دهی شود و خروجی بگیریم
-
اگه سوال آرایه ای بود فکر کنیم با مرتب کردن میشه پیچیدگی زمانی رو کاهش داد ؟
-
گاهی در مسایل می توان برای کاهش پیچیدگی زمانی آن رو در map ریخت
-
یادمون باشه بپرسیم میشه از پکیج هایی مانند sort استفاده کرد یا نه ، شاید هدف اصلی طرح سوال sort نباشد و بتوان sort کرد