Tech Stuff
عکس
رویداد استفاده از Wireshark در مهندسی معکوس
چطور می تونیم با بررسی ارتباط بین یک کلاینت و سرور رفتار مشابه رو شبیه سازی و مهندسی معکوس کنیم. این رفتار رو میشه با ضبط پکت های ارتباطی و باز نویسی و یا حتی ارسال مجدد باز طراحی کرد، که حتی برای موارد امنیتی هم در نظر گرفته میشه.
https://thealibigdeli.ir/r/wq2eQ6/
@thealibigdeli_channel
#event
8 · 680 · پیوند
برای نمایش کلیک کنید
برای نمایش کلیک کنید
چه کسانی مهندسان ارشد ۲۰۳۵ خواهند بود؟
بعد از تعدیلهای بعد از کرونا، استخدام توی همه بخشها کند شده؛ چون شرکتا منتظرن ببینن نتیجه بهرهوری حاصل از AI و وضعیت اقتصادی چطور بوده. همین موضوع روی تازهکارها هم تاثیر گذاشته و زمان سختی برای فارغالتحصیلی از علوم کامپیوتر شده.
این مقاله تاثیر AI روی مهندسای جونیور رو بررسی میکنه و در نهایت برای افراد توی سطحی که هستن (مهندس یا رهبر ارشد، مدیر و یا برنامهنویس تازهکار) پیشنهاداتی ارائه میده.
#recent_reads
@techstuff100
70 · 1.7K · Tech Stuff
عکس
چرا Big O یکسان به معنی سرعت یکسان نیست؟
فرض کنید ۲ تا تابع داریم که هر دو پیچیدگی زمانی O(n) دارن. این لزوما به این معنی نیست که هر دو در عمل یک سرعت اجرا دارن. مثال رو در نظر بگیرین. print_items و print_items2 هر دو یکبار روی لیست حلقه میزنن. اما print_items سریعتره؛ چون یک ثانیه مکث برای پرینت هر آیتم رو نداره.
وقتی که میگیم پیچیدگی زمانی O(n) هست، منظورمون اینه که زمان اجرای اون با رشد n به صورت خطی رشد میکنه. در اصل داریم میگیم c * n که این c یه مقدار زمان ثابته که الگوریتم ما میگیره. مثلا برای print_items ممکنه 10ms و برای print_items2 همون 1s باشه.
اگر دو الگوریتم پیچیدگی زمانی big O متفاوتی داشته باشن، معمولا مقدار c رو نادیده میگیریم. مثلا بین جستجوی باینری و جستجوی خطی، مقدار c تاثیری نداره؛ چون در نهایت جستجوی باینری سریعتره.
یه نمونه از زمانی که مقدار ثابت c اهمیت پیدا میکنه، quick sort در برابر merge sort ه. quick sort مقدار ثابت c کوچکتری از merge sort داره. پس اگه جفتشون O(n log n) باشن، quick sort سریعتره.
#Grokking_Algorithms #algorithm
@techstuff100
14 · 1.5K · Tech Stuff
استراتژیهای Retry در سیستمهای توزیعشده
وقتی یه درخواست fail میشه، معمولا میتونیم Retry کنیم.
چند تا از استراتژیهای رایج:
یک. Immediate Retry: بلافاصله دوباره درخواست میفرستیم. ساده و سریعه؛ ولی اگه مشکل همچنان وجود داشته باشه، میتونه باعث درخواستهای پشتسرهم و فشار بیشتر بشه.
دو. Fixed Interval: بعد از هر خطا مدت زمان ثابتی صبر میکنیم؛ مثلا هر ۵ ثانیه یکبار. سادهست؛ ولی ممکنه فاصله انتخابشده بیش از حد کوتاه یا طولانی باشه.
سه. Incremental Interval: فاصله Retryها کم کم بیشتر میشه؛ مثلا ۱، ۲، ۳، ۴ ثانیه.
چهار. Exponential Backoff: فاصله بین Retryها بهصورت نمایی افزایش پیدا میکنه؛ مثلا ۱، ۲، ۴، ۸ ثانیه. برای خطاهایی که احتمال میدیم بعد از مدتی برطرف بشن معمولا انتخاب مناسبیه. بهتره تعداد Retry یا حداکثر زمان انتظار هم محدود بشه.
پنج. Jitter: یک مقدار تصادفی به زمان انتظار اضافه میکنیم تا چندین کلاینت همزمان Retry نکنن.
شش. Circuit Breaker: وقتی تعداد خطاها از حد مشخصی بیشتر بشه، موقتا Retry و درخواستهای جدید رو متوقف میکنیم تا سرویس مقصد فرصت ریکاوری داشته باشه.
هفت. Adaptive Retry: استراتژی Retry رو بر اساس شرایط فعلی سیستم، مثل Load، Failure Rate و Response Time تغییر میدیم.
هشت. Cancel: اگر خطا دائمی باشه یا Retry کردن احتمال موفقیت نداشته باشه، بهجای ادامه دادن، درخواست رو کنسل میکنیم.
در عمل معمولا یک ترکیب از این روشها استفاده میشه؛ مثلا Exponential Backoff + Jitter + محدودیت تعداد Retry. همچنین برای درخواستهایی مثل پرداخت باید Idempotency رو هم در نظر گرفت تا Retry باعث اجرای چندباره یه عملیات نشه.
#system_design
@techstuff100
25 · 1.4K · عکس
همونایی که فقط یه مهندس نرمافزار میتونه ببینه 👀
این داستان یکی از بچهها توی هلند هست برام جالب بود:
مدتی هست که بخاطر هوش مصنوعی فشار کار فنی کمتر شده، سعی میکنم از فرصت پیشاومده استفاده کنم و یکم از نقش خودم بالاتر برم و کارهایی بکنم که در سالهای قبل از هوش مصنوعی اصلاً به ذهنم هم خطور نمیکرد و کسی هم انتظار نداشت انجام بدم. مثلاً به تیمهای دیگه مثل تیم فروش و بازاریابی سر میزنم و میببینم محصولی که ساختیم از دیدگاه اونها یا مشتریها چطوریه و آیا کم و کاستی داره یا نه
یکی از چیزهایی که جدیداً انجام دادم این بود که درخواست کردم دسترسی Search Console گوگل رو بهم بدن تا ببینم اپ توی سرچ گوگل وضعیتش چطوریه. و دیدم یه سری چیزها و آمارها بالا پایین هست 😄🙈 و گرههای ریزی توی دشبرد وجود داره شاید از دید یک فرد غیر فنی پنهان بمونه. چیزهایی که وظیفه تیم فنی بود.
این کار پیشدستانه باعث شد دست به کار بشم و چندین فیکس انجام بدم. از جمله بهبود سئو و سرعت برنامه. نکات ریزی که شاید بدون دخالت من به من منتقل نمیشد. تجربهای که از این اتفاق گرفتم این بود که بعضی وقتها چیزهایی که به چشم یه فرد فنی میاد رو تیمها و افراد دیگه ندارن
اگه مهندس نرمافزار هستید سعی کنید از این نکتهها و فعالیتها غافل نشین. اینطور که من بازار و تغییرات مشاغل رو میبینم، شغل مهندسی نرمافزار کمکم داره از حالت کلاسیک خودش که ۸۰٪ کدنویسی بود فاصله میگیره و فعالیتهایی فراتر از اون یعنی تعاملات انسانی توی اون داره پررنگتر میشه
یه مقاله هم جدیداً خوندم با عنوان «شغلهای جدید مهندسی نرمافزار توی دوران هوش مصنوعی». یکی از این شغلها که خیلی داره سر زبونها میچرخه Forward Deployed Engineer هست که به مهندس نرمافزاری گفته میشه میره پیش مشتریها، الگوهای پیدا و پنهان اون شرکت رو یاد بگیره (همونایی که فقط یه مهندس نرمافزار میتونه ببینه) و از این تجربه یه محصول قابل استفاده برای همه مشتریهای فعلی و بعدی بسازه
18 · 665 · Tech Stuff
عکس
متود reduceRight در جاوااسکریپت
متود reduceRight شبیه به reduce عمل میکنه؛ با این تفاوت که reduceRight تابع کال بک reducer رو از راست به چپ (ایندکس نزولی) اعمال میکنه و مقدار نهایی رو بر میگردونه. پارامترها و مقدار بازگشتیش دقیقا مثل reduceه. مثال رو ببینید.
#javascript
@techstuff100
1 · 675 · Tech Stuff
عکس
هدر Referer
یه سوالی که ممکنه باهاش مواجه شیم اینه که بازدیدکنندهها از کجا دارن میان به وبسایتمون. مثلا از گوگل ما رو پیدا کردن یا لینکدین. با هدر Referer میتونیم جواب این سوال رو بدیم.
این هدر آدرس URLی رو میده که کاربر از اونجا به سایت مقصد رسیده. مثلا توی گوگل وقتی یچیزی رو سرچ میکنیم و روی یه لینک کلیک میکنیم، مقدار این هدر مثل عکس میشه. ازش میتونیم برای analytics و logging استفاده کنیم. اما خیلی هم نمیشه بهش اعتماد کرد؛ چون میشه برای مثال با curl تغییرش داد.
یه نکته امنیتی هم داره. توی صفحات فراموشی رمز عبور، URL صفحه معمولا چنین چیزیه:
jalali[.]com/forgot-password?token=ABC
حالا اگه توی این صفحه، لینک به صفحات اجتماعی مثل اینستاگرام و لینکدین داشته باشیم و کاربر روش کلیک کنه، به مثلا اینستاگرام هدایت میشیم درحالی که Referer چنین مقداری گرفته:
jalali[.]com/forgot-password?token=ABC
و این یعنی که توکن کاربر لو رفته.
#cyber_security
@techstuff100
7 · 1.2K · Tech Stuff
پاسخدیروز بعد ۲ ماه، آموزشی سربازیم توی نیروی دریایی ارتش تموم شد. توی این ۲ ماه مثل قبل نتونستم فعالیت کنم و یسری از کارهام عقب افتادن یا با تاخیر تونستم انجامشون بدم.
توی مدتی که پادگان بودم، به امریه دانشبنیان و پروژه جایگزین خدمتم فکر میکردم که هر کدوم به یه دلیلی رد شدن. به وقت و انرژی که صرفشونعکس
۱۲ ماه از خدمتم گذشت...
یسری روزاش رو واقعا خسته بودم و حوصله خودم رو هم نداشتم؛ ولی سعی کردم که حتی توی چنین روزایی بازم یادگیری رو ادامه بدم. شده در حدی که مثلا ۵ دقیقه صرفا کتاب رو باز کنم و همینجوری به نوشتههاش نگاه کنم.
در نهایت بقول یکی از کادریها هر موقع خیلی ناراحت بودین به اون حلزونی فکر کنین که داشته بیخبر از همه جا از جلوی آبدارخونه رد میشده و فلانی با ۱۴۰ کیلو وزن لگدش میکنه.
توی این ۱ سال دنبال کردم:
کتابها:
- Leaders Eat Last
- A Philosophy of Software Design
- System Design Interview Volume 1
- System Design Interview Volume 2
- Skills of a Successful Software Engineer
- Grokking Algorithms (در حال مطالعه)
کتابهای صوتی:
- The Subtle Art of Not Giving a F*ck
- The Old Man and the Sea
- Rich Dad Poor Dad
- The Hacker Mindset
پادکستها:
- طبقه ۱۶
- کار نکن
- رختکن بازندهها
- رادیو جادی
- رادیو راه
- هک و گپ
- امیفر
- خداحافظ آفریقا
- بنفش
- عصر حجر
- جافکری
- آسوی روناکی
- دورادور
- کوشیار عظیمیان
- رخ
- اکسپت
- فیوز
- موموتاک
- بیپلاس
- کوزی کرنر
- BigDeal
#سربازی
@techstuff100
36 · 739 · Tech Stuff
پیوند
برای نمایش کلیک کنید
برای نمایش کلیک کنید
چطور به عنوان یه مهندس قابلاطمینان، اعتبار بسازیم؟
برای اینکه از دید مدیر یا سهامدارمون قابلاطمینان بنظر بیایم، باید سعی کنیم از دید اونها به مسائل نگاه کنیم و برای این هدف یسری کارها رو میتونیم انجام بدیم؛ مثل اعتراف به اشتباهات، کنسل کردن جلسات بیهوده، نه گفتن در غالب اوقات، مدیر رو در جریان تغییرات گذاشتن و ...
[لینک مقاله]
#recent_reads
@techstuff100
10 · 652 · Tech Stuff
عکس
چطور ریموت کار کنیم
ریموت کار کردن فقط این نیست که لپتاپمون رو برداریم و از خونه کار کنیم. وقتی ریموت کار میکنیم، هنوز عضوی از یه تیم هستیم و باید در زمان کاری در دسترس باشیم. البته این به معنی آنلاین بودن ۲۴ ساعته نیست. باید بتونیم بین زمان کار و زندگی شخصی یه مرز مشخص داشته باشیم و بعد از تموم شدن کار واقعا ازش فاصله بگیریم.
از طرف دیگه باید حواسمون به زمان بقیه هم باشه، مخصوصا وقتی اعضای تیم توی تایمزونهای مختلف هستن. برای جلسه یا پیام دادن، ساعت کاری طرف مقابل رو در نظر بگیریم. محیط خونه هم میتونه پر از حواسپرتی باشه، پس باید یاد بگیریم تمرکزمون رو حفظ کنیم و یه روتین مشخص برای کار داشته باشیم. در کنارش رعایت قوانین امنیتی شرکت مثل آپدیت نگه داشتن سیستمعامل و رعایت سیاستهای مربوط به پسورد هم بخشی از مسئولیت ماست. ریموت کار کردن آزادی بیشتری میده، ولی برای اینکه واقعا خوب پیش بره، نیاز به نظم و مسئولیتپذیری بیشتری داره.
#Skills_of_a_Successful_Software_Engineer
@techstuff100
18 · 971 · Tech Stuff
عکس
پرفورمنس hash table
پرفورمنس hash tableها بطور متوسط (average case) پیچیدگی زمانی O(1) داره. هم توی سرچ، هم insert و هم حذف. اما توی worst case به O(n) میرسه که اصلا چیز خوبی نیست. یعنی توی بدترین حالت مثل آرایهست توی insert و delete و مثل linked list توی سرچ. برای اینکه به worst case نخوریم باید از collisionها جلوگیری کنیم و برای این کار به load factor (LF) و hash function خوب نیاز داریم.
برای ذخیره آیتمهای hash table از آرایه استفاده میکنیم. LF اینطور محاسبه میشه: تعداد آیتمهای ذخیره شده در hash table تقسیم بر تعداد کل slotها. برای مثال اگه آرایهمون ۵ تا slot داشته باشه و ۲ تا آیتم ذخیره کرده باشه، LFمون میشه 0.4.
(1/2)
#Grokking_Algorithms #algorithm
@techstuff100
4 · 813 · پاسخپرفورمنس hash table
پرفورمنس hash tableها بطور متوسط (average case) پیچیدگی زمانی O(1) داره. هم توی سرچ، هم insert و هم حذف. اما توی worst case به O(n) میرسه که اصلا چیز خوبی نیست. یعنی توی بدترین حالت مثل آرایهست توی insert و delete و مثل linked list توی سرچ. برای اینکه به worst case نخوریم باید
با بزرگ شدن LF باید slotهای بیشتری به hash tableمون اضافه کنیم که بهش میگن resizing. منطقیه که سایز آرایه رو دو برابر کنیم. بعدش تمام آیتمهای موجود رو با hash function دوباره توی hash table جدید وارد میکنیم. هرچی LF کمتر، تعداد collisionها هم کمتر. قانون کلیش هم اینه که وقتی LF بزرگتر از 0.7 شد resize کنیم. resizing هم هزینهبره؛ اما اغلب اوقات لازم نمیشه که resize کنیم و بطور متوسط resizing هم پیچیدگی O(1) داره.
یه hash function خوب هم مقادیر رو بطور مساوی داخل آرایه توزیع میکنه.
(2/2)
#Grokking_Algorithms #algorithm
@techstuff100
4 · 380 · Tech Stuff
پیوند
برای نمایش کلیک کنید
برای نمایش کلیک کنید
قانون پارکینسون میگه کار اونقدر کش پیدا میکنه تا زمانی که برای تکمیلش داریم رو پر کنه. پروژههایی که ددلاینی ندارن، بیشتر از اونچه که باید زمان میگیرن و ست کردن ددلاینهای چالشی (منظور ددلاین غیرممکن نیست) باعث میشه نتایج بهتری بگیریم. اینجا مفهومی به اسم Iron Triangle میاد وسط که سه تا محدودیت کلیدی یه پروژه رو تعریف میکنه: اسکوپ، منابع و زمان. با تغییر یکی، دو تای دیگه تغییر میکنن.
[مقاله]
#recent_reads
@techstuff100
11 · 335 · Tech Stuff
عکس
خروجی کد بالا (1) چیه؟
شاید اینطور فکر کنیم که وقتی به return "try" میرسیم، اجرای تابع متوقف میشه و خروجی کد "try" میشه؛ اما "finally" چاپ میشه. برای درک بهتر این موضوع لازمه با Completion Record آشنا بشیم.
ا Completion Record به آبجکتی گفته میشه که نتیجه اجرای یه دستور یا عبارت رو مشخص میکنه. js با اجرای هر statement یه Completion Record ایجاد میکنه و ۳ تا فیلد داره:
یک. type برای نوع نتیجه که یکی از مقادیر normal (اجرای عادی)، break، continue، return و throw میتونه باشه.
دو. value برای مقدار تولید شده.
سه. target که مقصد رو برای break و continue مشخص میکنه.
توی مثال وقتی return "try" اجرا میشه، یه Completion Record با مشخصات (2) ایجاد میشه. اما قبل از اینکه تابع واقعا return کنه، بلاک finally اجرا میشه. داخل finally هم یه return داریم که Completion Record (3) رو تولید میکنه و نتیجه قبلی جایگزین میشه. پس در نهایت مقدار "finally" برگردونده میشه.
اگه finally بهصورت normal تموم میشد و Completion جدیدی مثل return یا throw تولید نمیکرد، نتیجه قبلی حفظ میشد.
#javascript
@techstuff100
5 · 458 · Tech Stuff
عکس
فاصله Levenshtein حداقل تعداد عملیاتهای ممکن (insertion، deletion و substitution) برای تبدیل یه رشته به یه رشته دیگه رو اندازهگیری میکنه. از کاربردهاش هم میشه به spell-checking و autocorrect و همینطور پیدا کردن اسمها یا عبارتهای مشابه بخصوص توی سرچ اشاره کرد.
این مثال رو در نظر بگیرید. فاصله بین kitten و sitting سه هستش:
kitten -> sitten -> sittin -> sitting
برای محاسبهش از dynamic programming استفاده میکنیم. grid پرشده مثال این شکلی میشه (1). مقدار هر سلول طبق فرمول (2) بدست اومده و عدد داخلش نشون میده حداقل فاصله ویرایشی بین دو prefix متناظر با اون سلول چقدره. مثلا سلول (3,2) مقدار 2 داره؛ این یعنی فاصله بین si و kit دو هستش. مقدار سلول پایین-راست هم جواب نهاییمونه.
برای تمرینش میتونین مسئله لیتکد 72. Edit Distance رو حل کنین.
#algorithm
@techstuff100
5 · 640 · Tech Stuff
با alias میتونیم توی شل برای یه دستور اسم کوتاهتری تعریف کنیم. مثلا بجای هربار بجای این دستور طولانی:
git log --oneline --graph --decorate
میتونیم یکبار این دستور رو اجرا کنیم:
alias gl='git log --oneline --graph --decorate'
از این به بعد با اجرای gl دستور کامل اجرا میشه.
البته alias بصورت پیشفرض فقط توی همون سشن ترمینال در دسترسه و با بستن ترمینال از بین میره. برای دائمی کردنش میتونیم به .bashrc اضافهش کنیم:
echo "alias gl='git log --oneline --graph --decorate'" >> ~/.bashrc
@techstuff100
👍7❤3👏2
4 · 589 · Tech Stuff
چیزهایی که نباید در مصاحبه فنی بگیم
در طول مصاحبه فرصت زیادی برای صحبت داریم؛ چه زمانی که داریم یه سوال مستقیم رو جواب میدیم یا زمانی که ازمون میخوان که درباره خودمون صحبت کنیم یا وقتی که میگن هر سوالی که داریم بپرسیم. توی چنین مواقعی قطعا باید خودمون باشیم ولی بعضی وقتا زیادی ریلکس بودن مشکلسازه. مثلا همه مصاحبهکنندهها شاید حس طنز ما رو نداشته باشن. برای اینکه تصویر خوبی از خودمون بسازیم، یسری چیزا رو بهتره نگیم:
۱. اینجا دقیقا چه کاری انجام میدید؟
نشون میده درباره شرکت، خوب تحقیق نکردیم. مثلا بهتره بگیم «اینجا چطور با نود کار میکنید؟».
۲. نمیدونم. تاحالا چنین کاری انجام ندادم.
نشون میده که وقتی با مشکلات جدید مواجه میشیم، بلاک میشیم و نمیتونیم حلشون کنیم. بهتره بگیم «نمیدونم ولی امتحانش میکنم تا ...».
۳. از اون محل متنفر بودم.
وقتی میپرسن که چرا از کار قبلیمون اومدیم بیرون، بهتره از اونجا (حداقل بطور رسمی) متنفر نباشیم؛ چون ممکنه باعث نشون دادن بدترین وجه خودمون بشه. بهتره روی چیزای مثبت و چیزایی که از اونجا یاد گرفتیم تمرکز کنیم.
۴. هیچکس دیگه از اون استفاده نمیکنه.
از عبارات قطعی استفاده نکنیم. چطور میتونیم با قاطعیت بگیم فلان چیز توی صنعت به این بزرگی دیگه استفاده نمیشه؟ اگه بگیم «تا جایی که من میدونم ...» بهتره.
۵. توی رزومهم گذاشتمش.
توی مصاحبه ممکنه درباره چیزی که چیزایی که توی رزومهمون نوشتیم بپرسن. نگیم که توی رزومهم هستش. مصاحبهکننده تنبل نیست.
۶. نه، هیچ سوالی ندارم.
مصاحبه فقط برای این نیست که اونا ما رو بشناسن. ما هم باید بشناسیمشون. پس سوالات مناسب داشته باشیم.
۷. من یه توسعهدهنده Reactم.
با این جمله داریم خودمون رو محدود به React میکنیم. ما توسعهدهنده هستیم و اصول برنامهنویسی رو بلدیم. تکنولوژیها میان و میرن. این نشون میده ما انعطافپذیریم.
۸. لینوکس؟ ازش متنفرم. عاشق ویندوزم.
متنفر بودن از تکنولوژی توی مصاحبه فنی یه چراغ قرمزه. ممکنه با یه چیزی حال نکنیم. ولی ابزار، ابزاره و باید با اونی که برای شرایط فعلیمون مناسبه پیش بریم.
#Skills_of_a_Successful_Software_Engineer
@techstuff100
❤13👏2
43 · 1.2K · Tech Stuff
قبلا بخش زیادی از کار برنامهنویسی صرفا این بود که بتونیم چیزی رو بسازیم و به مرحله اجرا برسونیم. الان با کمک AI ساختن نرمافزار راحتتر شده و تقریبا هرکسی میتونه یه خروجی قابلقبول تولید کنه. برای همین چیزی که اهمیت بیشتری پیدا کرده taste یا همون قدرت تشخیص کیفیت و تصمیمگیریه؛ اینکه بتونیم بهترین راهحل رو انتخاب کنیم و به هر چیزی که صرفا کار کنه راضی نشیم.
نویسنده میگه این مهارت از اشتباه کردن و یاد گرفتن از شکستها بدست میاد. مشکل اینه که AI با حذف سختیهای مسیر ممکنه فرصت یادگیری از همین اشتباهات رو هم ازمون بگیره.
[مقاله]
#recent_reads
@techstuff100
👍11❤3👏1
14 · 317 ·