جنگولرن
3.81K subscribers
287 photos
74 videos
31 files
556 links
آموزش Django و بستگان
Download Telegram
Forwarded from Python BackendHub
تو کامنتا خیلی سریع به جواب اشاره کردن, وقتی دارین با فست یا هر asgi دیگه ای کار میکنید باید حواستون باشه, که به هیچ وجه هیچ جایی از اپلیکیشنتون تسک IO باند نداشته باشین که بلاک کنه main thread تون رو.

چرا؟‌چون بای دیفالت روتر async رو ترد اصلی process ران میشه, بنابراین اگه بلاک شه هم ترد اصلیتون بلاک میشه هم process یعنی تو اون پروسه و ورکر دیگه نمیتونید هیچ درخواستی رو return کنید.

راه حلش چیه؟
https://asgi.readthedocs.io/en/latest/introduction.html#wsgi-compatibility

تو fastapi شما میتونید همچنان کدتون رو با sync هم ران کنید. اگه روترتون io bound داره که sync عه و بلاک میکنه میتونید روترتون رو sync کنید. اتفاقی که اون پشت میفته اینه که fastapi میاد درخواست شما رو تو یک ترد جدا هندل میکنه. داخل asgiref هم نمونه مشابهش هست, که sync_to_async هست. خودتونم میتونید مشابهشو بنویسید و تو executor thread ران کنید کنار بقیه کد های async تون. میتونید از لایبری سباستین asyncer هم استفاده کنید که داخلش از AnyIO استفاده کرده که typingتون رو خراب نمیکنه و فیچر های خوبی داره:
https://github.com/tiangolo/asyncer

اما یادتون نره که پرفومنسی تو تسک های IO همیشه async بهتره از thread چون کم هزینه تره, کانتکس سوییچ نداره, استفاده کامل تری از ریسورستون میکنید و البته cpu bound هم بخاطر وجود GIL فعلا تو پایتون تفاوتی ایجاد نمیکنه. نکته ای که باید دقت کنید بهش لایبری که استفاده میکنید بهتره در درجه اول native async باشه یعنی واقعا async باشه و رو یک ترد non blocking کارشو انجام بده. اگه لایبری mature یا خوبی پیدا نکردین در درجه دوم میتونید از همین تکنیکی که گفتم استفاده کنید.

میتونید مقاله زیر رو بخونید که یکم بیشتر با ساختار و معماری asgi و wsgi آشنا شین:
https://medium.com/p/807158ed1d4c

@ManiFoldsPython
👍31
Python BackendHub
تو کامنتا خیلی سریع به جواب اشاره کردن, وقتی دارین با فست یا هر asgi دیگه ای کار میکنید باید حواستون باشه, که به هیچ وجه هیچ جایی از اپلیکیشنتون تسک IO باند نداشته باشین که بلاک کنه main thread تون رو. چرا؟‌چون بای دیفالت روتر async رو ترد اصلی process ران…
نکته ای که مانی توی کانال اش در مورد io گفته.

درسته که درباره fastapi هست و اینجا جنگولرن ع اما نکته اش و توضیحاتش به درد جنگو کارها و دیگران هم میخوره.

و اصلا نیاز به صورت مساله هم نداریم. چون توضیحاتش کامله
👍1
اگر دنبال یک پاسخ سرراست و مختصر برای «وقتی گوگل رو باز میکنیم چه اتفاقی می افته» این ویدیو با انیمیشن‌های زیبا و عمق کم در مورد URL و http و DNS و TCP و تا حدی TLS صحبت می‌کنه.

https://youtu.be/AlkDbnbv7dk?feature=shared
Forwarded from Microfrontend.ir
دیزاین پترن ها - دیاگرام کلاس Design Patterns رو چطوری بخونیم؟

در دومین ویدیو از پلی لیست الگوهای طراحی و دیزاین پترن ها به معرفی کلاس دیاگرام UML به عنوان زبان مشترک برنامه نویسان برای توصیف سیستم های شی گرا پرداختیم. نخستین گام یادگیری Design Pattern های شی گرا درک ادبیات مشترک برنامه نویسان شی گراست. ابتدا شیوه طراحی کلاس و عضو های آن به همراه سطوح دسترسی ها را شرح دادیم. در ادامه انواع روابط بین کلاس ها شامل Dependency – Association – Aggregation Composition – inheritance را با ذکر مثال توضیح دادیم. سپس مفاهیم abstraction و interface را تشریح کردیم و تفاوت abstract class و interface را مطرح کردیم.


Link: https://youtu.be/s-lJfW5YABQ

playlist: https://www.youtube.com/playlist?list=PLJ9zDGwhhsBxUIWhfp9euGlbBIrQUhm2Q

〰️〰️〰️〰️〰️〰️
©@microfrontend_ir
👍5
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (SeYeD.Dev)
سرعت یا راحتی یا قدرت ؟ چرا جنگو پر سرعت ترین فریمورک نیست در حالی که پر طرفدار ترینه ؟

ببینید شما چرا با پایتون کد میزنید ؟ سرعتش نسبت به تقریبا هر زبانی کند تره، میتونید cpp کد بزنید و سرعتی نزدیک به نور داشته باشید🤔

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

چرا ؟ چون شما یک عالمه میدلور و موارد مختلف جهت بررسی رکوئست ورودی و خروجی دارید و یک عالمه چیز میز تو فریمورک هست که شما کد کمتری بزنید اما خروجی متناسب رو داشته باشید. دقیقا همون مقایسه بین پایتون و cpp ممکنه ۱۰۰ لاین cpp رو توی ۵ خط پایتون بشه خلاصه کرد

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

خب حالا این مشکل کندی چطور برطرف میشه ؟ شما کد رو درست بنویس، متخصص دواپس میاد مشکل رو برات حل میکنه و با اسکیل درست خیال شمارو برای هر تعداد کاربری راحت میکنه

@SEYED_BAX
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
Forwarded from Security Analysis (Adel)
⭕️ در MSFarsi یه بوت کمپ رایگان یکماهه Azure Fundamental قراره برگزار بشه.

برای ورود به Public Cloud فرصت خوبیه مخصوصا برای بچه هایی که میخوان مهاجرت کنند.

لینک ثبتنام :
https://events.teams.microsoft.com/event/e2dd3564-b624-4c3e-8fcb-96815bff7170@b4c9f32e-da17-4ded-9c95-ce9da38f25d9
@securation
1👍1
Forwarded from Pythonism
در ادامه درباره دو قابلیت مهم در پایتون پیشرفته صحبت می‌کنم ، دستورات filter و تابع map در پایتون

تابع map در پایتون این امکان رو به شما میده که یک تابع رو روی تمام اعضای یک لیست اعمال کنید.

نحوه تعریف map به صورت زیر هست.

Map(function , list_name)

ورودی اول دستور map یک تابع است که باید روی لیست اعمال بشه که معمولا یک lambda function است و ورودی دوم دستور نام لیستی است که تابع روی اون اعمال میشه‌. map(lambda x: x**2, items)

#FXL
#lambda
#filter
#map
#lambda_function
#Anonymous
#true
#expression
👍2
Forwarded from Pythonism
قابلیت filter شبیه به مپ عمل می‌کنه با این تفاوت که امکان چک کردن یک شرط رو روی تمام اعضای یک لیست رو فراهم می‌کنه.

filter(lambda x: x < 0, number_list)


#FXL
#lambda
#filter
#map
#lambda_function
#Anonymous
#true
#expression
👍7
Forwarded from یادگیری ماشین با چاشنی صنعت (Abolfazl 🤘)
ساخت ID های منحصر به فرد در دیتابیس های توزیع شده ( قسمت اول)

سلام دوستان عزیز امیدوارم که حالتون خوب باشه. در کنارتون هستیم با یکی از پرکاربرد ترین و مهمترین مسئله های حوزه مهندسی نرم افزار و در حیطه سیستم های توزیع شده.
ما در قسمت قبل کمی درباره سیستم های توزیع شده و همینطور sharding صحبت کردیم و یه دید کلی نسبت بهش به دست آوردیم.
فرض کنید ما یک سیستم بزرگ داریم که با حجم مناسبی از داده ها سر و کار داریم ( منظورم بیگ دیتا نیست) و نیاز داریم که داده ها رو در دیتابیس های مختلفی ذخیره کنیم به جای این که یک سرور دیتابیس داشته باشیم و صفر تا صد رو داخل اون ذخیره کنیم.
اگر sql بدونید و با دیتابیس ها کار کرده باشید میدونید ما یک کلید داریم تحت عنوان primary key یا کلید اصلی. که معمولا یا یک مقدار منحصر به فرد مثل کد ملی داره و یا این که auto increment هست ( یعنی کلید هر ردیف رو به شکل اتوماتیک ست میکنه : ۱و۳و۵و... که تو این مثال کلید ها دو تا دوتا اضافه شدن).
ویژگی auto increment مزیت هایی داره :
یک ) مطمئن هستیم که هیچوقت کلید تکراری در یک دیتابیس تولید نمیشه.
دو) کلید ها از الگوی خاصی پیروی میکنن که این هم میتونه مزیت و هم عیب محسوب بشه.
اما این روش اشکالاتی هم داره. زمانی که شما میخواید از معماری توزیع شده استفاده کنید قطعا بیش از یک دیتابیس دارید. مثلا دو تا یا سه تا. و هر کدوم از این دیتابیس ها نمیتونن با یک الگوی خاص داده رو ذخیره کنن.( اینطوری کلید تکراری میخوریم و مشکل بزرگ ایجاد میشه برامون)
و اما راه حل چیه؟
راه حل اول : از الگو های متفاوتی استفاده کنیم برا auto increment به عنوان مثال در دیتابیس A و B مثال های زیر رو ببینین
A : 1,3,5,7,...
B: 2,4,6,8,...

به نظر راه حل خوبی میاد ولی چند اشکال داره:

۱.مقیاس پذیری دشوار
۲.اگر سروری کم و زیاد بشه مقیاس پذیری ما به F**k میره :)

این یه مقدمه ای بود راجع به این چالشی که این روزا زیاد باهاش دست و پنجه نرم میکنیم. تو قسمت بعدی به ارائه روش های مناسبتری برای حل این چالش میپردازیم
Forwarded from یادگیری ماشین با چاشنی صنعت (Abolfazl 🤘)
ساخت ID های منحصر به فرد در دیتابیس های توزیع شده ( قسمت دوم)
سلام دوستان امیدوارم که حالتون خوب باشه. این بار میخوایم قسمت قبل رو که یه مقدمه ای بود درباره دیتابیس های توزیع شده ادامه بدیم و یکم عمیق تر موضوع رو بررسی کنیم پس با ما همراه باشید.

راه حل بعدی که برای توزیع کلید ها بررسی میکنیم اسمش هست UUID
قطعا اگر توسعه پشت-انتها ( همون بک اند خودمونه) رو کار کرده باشید حداقل یکبار اسم UUID به گوشتون خورده. به یه شکل کلی بخوام توضیحش بدم میاد یه کلیدی که احتمال منحصر به فرد بودنش خیلی بالاست رو تولید میکنه و تو فیلد primary key دیتابیس قرار میده ( ۱۲۸ بیت هست) از قابل اعتماد بودن این روش همینقد اشاره کنم که اگر صد سال شما هر ثانیه یک کلید generate کنید، تازه احتمال تولید کلید تکراری به ۵۰ درصد میرسه. جالب نیست؟
این یه نمونه از UUID هست :09c93e62-50b4-468d-bf8a-c07e1040bfb2.
اینطوری با خیال راحت میتونید کلید های منحصر به فرد رو بین سرور های مختلف پخش کنید بدون هیچگونه نگرانی از تولید کلید های مشابه.

در واقع اینطور بگم که شما اگر پروژه بک اندتون رو روی چند سرور ران کنید، هر کدوم از سرور ها هر بار که نیاز شه یک کلید مجزا تولید میکنن بدون مشکل.
مشخصه که مشکلات مقیاس پذیری میاد پایین و این روش واقعا ساده و کم هزینست.
از معایبش هم اینه ۱۲۸ بیت رو رزرو میکنه در حالی که ما ۶۴ بیت فقط نیاز داریم و این که کلید تولیدی تنها عدد نیست ( البته عیب بزرگی محسوب نمیشن)
👍2
Forwarded from Python BackendHub
یکی از مشکلاتی که اکثر برنامه نویسا دارن تو مدیریت دپندسیه! حالا لایبری جدید یا external service که قراره ازش استفاده کنن.

مشکل چیه؟‌برنامه نویس میاد یک توتوریال از اون دپندسی جدید میبینه با خودش میگه ایول چه باحاله و تصمیم میگیره اضافش کنه! و این بد ترین کاریه که میتونید بکنید. قراره وابسته بشین به چیزی. فکر کنید این وابستگی از جنس عاطفیه. همینقدر باید باهاش حساس برخورد کنید :))

خب چیکار کنیم؟
اولین کاری که میکنید اینه که توتوریالشو میریزین دور. میرین داکیومنتشو خوب میخونید. متوجه میشین limitation هاش چیه. متوجه میشین سیستمش چطور کار میکنه. یک داکیومنت مختصر شده ازش میسازین و cons pro هاشو در میارین. مثلا یعنی چی؟

فکر کنید مثلا دارین یک external system اضافه میکنید. مثلا یک CRM. خب اول باید چک کنید چه limitation هایی داره؟‌ایا api داره؟‌ایا web hook داره؟ ایا share state به وجود میاد؟ هزینش چقدره؟ alternative هاش چیه؟ چطور اصلا کار میکنه؟ اصلا خوب کار میکنه؟!
بعد تو درجه دوم میرین گوگل میکنید و مقاله هایی پیدا میکنید که نقاط ضعفشو بیشتر گفته. ممکنه همه نقاط ضعفش تو داکیومنتش نباشه و یکم پنهان باشه. میبینید بقیه چه چالش هایی داشتن موقع کار کردن باهاش.
در نهایت بین آپشن ها یک لیست pro cons میسازین و تصمیم گیری نهایی رو میکنید.


اگه این کارو نکنیم چه اتفاقی میفته؟
بذارین مثال بگم. مثلا شما ندیدین این api limit احمقانه ای داره. بعد کلی روش کد میزنید. یک روزی سایز بیزنستون بزرگ تر میشه و حالا هرچی کد رو زدین باید undo کنید.


همیشه تو انتخاب دپندسی هاتون خیلی فکر کنید! من بعضا دیدم بچه ها میگن <کارفرما اینطوری گفته> یا <مدیر تیم با این بیشتر حال کرده>‌. اینا دلایل منطقی اصلا نیستن برای انتخاب یک دپندسی.

@ManiFoldsPython
👍7🥱1
Forwarded from CodeCrafters (مجتبی)
یکی از مهم ترین بخش های زبان کوئری نویسی SQL قسمت WHERE JOIN هست از هر دو میتوان برای کوئری زدن روی دو و یا چند جدول استفاده کرد اما تفاوت هایی با هم خواهند داشت با ذکر یک مثال این مورد را بیشتر توضیح میدهیم.
دو جدول فرضی را در نظر بگیرید
۱. جدول User با مقادیر Id, user_name , phone_number
۲.جدول Book با مقادیر Id, name, price, phone_number
(در واقعیت جدول Book به جدول User با کلید خارجی متصل میشود ولی در این مثال از این مورد چشم پوشی شده است )

اگر بخواهیم با استفاده از WHERE اطلاعات این دو جدول را بر اساس شرط phone_number با هم ترکیب کنیم، می‌توانیم از کوئری زیر استفاده کنیم:

SELECT *
FROM User, Book
WHERE User.phone_number = Book.phone_number;

این کوئری تمام رکوردهایی را انتخاب می‌کند که مقدار phone_number آنها در هر دو جدول یکسان است.

همچنین، می‌توانیم با استفاده از JOIN اطلاعات این دو جدول را بر اساس شرط phone_number با هم ترکیب کنیم. این مثال را با استفاده از JOIN به صورت زیر توسعه می‌دهیم:

SELECT *
FROM User
JOIN Book ON User.phone_number = Book.phone_number;

این کوئری نیز تمام رکوردهایی را انتخاب می‌کند که مقدار phone_number آنها در هر دو جدول یکسان است. با استفاده از JOIN، ما رکوردهای مشابه را از دو جدول به هم متصل می‌کنیم تا نتایج را بدست آوریم.

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

#SQL
@code_crafters
5👍1
بالاخره بریم برای مطالعه کتاب
Fluent Python
شاید با این کتاب یکم پایتون یاد بگیریم

اگه نکته خاصی وجود داشت. توی کامنت های همین پست قرار میدم.
👍14
Forwarded from Python BackendHub
این مقاله که دیروز معرفی کردم یادتونه؟
یک سر رفتم تو سایتش
چقدر مطالب خوب داره راجب پایتون
و مخصوصا تایپینگ 👌

برای چیزای مربوط به تایپینگ:
https://adamj.eu/tech/tag/mypy/

برای پایتون به صورت کلی:
https://adamj.eu/tech/tag/python/

یک سر بزنید حتما 👌
@ManiFoldsPython
👍7
Forwarded from Microfrontend.ir
اگر برنامه نویس جنگو هستید حتما استفاده از select_related و prefetch_related رو تو کوییری ست هاتون مد نظر داشته باشید. دیروز با دوستی سرویسی رو چک میکردیم که کار سنگینی رو انجام و میداد و بیش از ۸۰ ثانیه رو یک سیستم نسبتا قوی طول میکشید، صرفا با اضافه کردن مواردی که گفتم تایم اجرا اومد رو ۵ ثانیه




بهینه سازی جنگو از طریق select_related
Link: https://youtu.be/TK3P4Cy5fNg


بهینه سازی جنگو از طریق prefetch_related
Link: https://youtu.be/lkThOygE8LM


بهینه سازی جنگو از طریق defer و only
Link: https://youtu.be/u629fDW5drM

پلی لیست نکته ها و ترفندهای جنگو:
https://www.youtube.com/playlist?list=PLJ9zDGwhhsBwdrfdaoOqbYev3_ocuBOfv


〰️〰️〰️〰️〰️〰️
© @microfrontend_ir
👍6
Forwarded from a pessimistic researcher (Kc)
"برنامه‌نویسی با طعم شیرین اثبات"
———————————————

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

قطع به یقین سیلابس اون درس، برپایه‌ی Curry–Howard isomorphism خواهد بود، بدون اینکه دانشجوها متوجه این قضیه بشن یا دردی احساس کنن :))) ممکنه بپرسید چرا چنین تصمیمی دارم و اصلا این چیزی که گفتم بدون درد و خون‌ریزی معنیش چیه.
بذارید کمک‌تون کنم. آقای Haskell Brooks Curry که به احترام ایشون، زبان برنامه‌نویسی Haskell، زبان برنامه نویسی Curry و زبان برنامه‌نویسی Brooks رو از روی نام ایشون انتخاب کردند، به همراه آقای Wiliam Howard یک رابطه‌ای کشف کردند که به Curry–Howard isomorphism معروفه. این رابطه به زبان ساده میگه که بین logic و programming، بین Proof و Program و بین Theorems و Types یک نوع Isomorphism وجود داره. یعنی هر Type یک Theorem و هر برنامه یک اثبات هستش. حالت معوکسش هم برقراره یعنی هر اثبات یک برنامه است. طبق این رابطه، میشه اثبات کرد زمانی که شما برای هر زبان برنامه‌نویسی که از نوع statically typed یا dependent type باشه(یعنی Type ای که وابسه به Value باشه)، یک Type Checker بسازید، در اصل براش یک Theorem Prover ساختید! بنابراین میشه برنامه‌هایی که با این زبان‌ها نوشته میشن رو طبق Curry–Howard isomorphism به یک اثبات تبدیل کرد و این به ما کمک میکنه که بتونیم درستی برنامه‌ای که نوشتیم رو اثبات کنیم.

حالا شاید براتون کم کم ملموس شده باشه که چرا می‌خوام چنین کاری بکنم. میام بهشون یه زبان Functional Dependent Type یاد میدم مثل Agda، Coq یا Idris که هم برنامه‌نویسی فرمال بر اساس Lambda Calculus که یک Universal Computation Model مثل ماشین تورینگ هست رو یاد بگیرن و هم بتونن با استفاده از Theorem Proving، درستی برنامه‌ای که نوشتن رو اثبات کنن.

حالا اصلا چرا این همه براتون حرف زدم و سرتون رو درد آوردم؟

چون همین چند روز پیش متوجه شدم که تفکر بنده رو قبلا بهش رسیدن و یه پارادایم برنامه‌نویسی بر اساسش توسعه دادن به نام Proof-Oriented Programming. یعنی همون موقعی که داری Program ات رو Design میکنی، اثبات درستیش رو هم جلو ببری.

هم پیمان با این پاردایم، زبان برنامه‌نویسی ای توسعه داده شده که هم Dependent Type Functional Programming هستش و هم با استفاده از Z3 که یک Theorem Prover هستش که برا اساس SMT-Solving کار میکنه، میتونیم برنامه‌هایی که باهاش می‌نویسیم رو اثبات کنیم. این زبان F* نام داره و اولین بار در سال ۲۰۱۱ توسط تیم Prosecco در موسسه‌ی INRIA Paris توسعه داده شد. بعدها Microsoft خیلی از این زبان خوشش اومد و پروژه توسط تیم Prosecco و Microsoft Research در سال ۲۰۱۶ بازنویسی شد و ورژن فعلی زبان F* بر اساس همون پیپر ۲۰۱۶ هستش. سینتکس زبان شبیه به ML هستش(یقینا منظورم اون ML دروغین که توی ذهن‌ همه‌تونه نیست :))) ).

برنامه‌های F* به طور معمول به زبان OCaml کامپایل و اجرا میشن. البته یک سری Fragment از زبان F* هم هستن که به C و Assembly کامپیال میشن مثل Low* که یک فرگمنت از زبان F* هستش.

شما به واسطه‌ی F* می‌تونید برنامه‌ای که می‌نویسید رو از چند جهت Verify کنید. یکیش اینه که برنامه از نظر Functionality داره درست کار میکنه که این میشه همون اثبات Correctness. بحث بعدی ویژگی‌های امنیتی به طور مثال اثبات کنید که برنامه‌تون هیچ وقت دیتا secrete رو Leak نمی‌کنه. و بحث آخر هم اثبات Lower bound و Upper Bound روی منابعی که مصرف می‌کنه.

اگر می‌خواید F* یاد بگیرید چند تا راه وجود داره. کتابی برای این زبان نوشته شده که به‌طور رایگان در دسترس عموم قرار داره و می‌تونید فایل PDF اش رو از اینجا دانلود کنید. از طریق این لینک هم می‌تونید به صورت Web-based این کتاب رو بخونید. خوبیشم اینه که همواره آپدیت میشه.

تعدادی هم مینی کورس بر اساس این زبان ساخته شده می‌تونید توی صفحه‌ی اصلی زبان، توی بخش Course Material به منابع این کورس ها اعم از Lecture Notes ها و کدها دسترسی پیدا کنید.
👏5👍1
Forwarded from Syntax | سینتکس (Alireza-fa)
تو سالهای اخیر اغلب شرکت‌های نرم‌افزاری خارجی و داخلی به سنجش قدرت حل مساله افراد از طریق پرسیدن سوال‌های الگوریتمی روی آوردند که به نظر من بسیار رویکرد خوبی برای مصاحبه هست. شاید مهمترین دلیلش این باشه که بیشتر از تسلط به ابزارها و تکنولوژی‌ها و حتی زبان‌های برنامه‌نویسی یا چارچوب‌ها، قدرت حل مساله و ارائه راهکار مناسب برای مسائل و چالش‌های مختلف عیار یه مهندس نرم‌افزار خوب رو مشخص می‌کنه. البته این مدل مصاحبه‌ها بیشتر برای توسعه‌دهنده‌ها مرسومه. ولی چه کنیم که در این مدل مصاحبه‌ها خروجی بهتری داشته باشیم؟

۱- قبل از مصاحبه حداقل چند روزی رو صرف مطالعه یه کتاب تو این زمینه بکنید و بد هم نیست چند تا مساله توی سایت‌هایی مثل Codeforces یا LeetCode یا HackerRank بکنید. برای کتاب هم من دو تا پیشنهاد دارم:
- کتاب Cracking the coding interview
https://www.crackingthecodinginterview.com/
- کتاب Algorithms Notes for Professionals
https://lnkd.in/dcC74Uxs

۲- حتما در طول مصاحبه سعی کنید بلند بلند فکر کنید و در مورد ابعاد مختلف مساله از مصاحبه‌کننده توضیح بخواید. این به شما کمک می‌کنه که هم فرصت بیشتری برای فکر کردن داشته باشید و هم مسیر رو درست برید. کلاً هر چی بیشتر در طول مصاحبه تعامل بکنید مثبت‌تره.

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

۴- معمولاً برای ارائه راه‌حل شما باید از یه زبان برنامه‌نویسی استفاده کنید و برخی مواقع مخصوصاً در مصاحبه‌های آنلاین ممکنه دسترسی به IDE نداشته باشید. بنابراین آماده این موضوع باشید. در زمان نوشتن سعی کنید کد رو تمیز و خوانا بنویسید چون معمولاً کیفیت کد روی نظر مصاحبه‌کننده تاثیر می‌ذاره.

پانوشت: پیرو کامنت بعضی از دوستان یه نکته اضافه کنم. ارزیابی توان حل مساله صرفاً بخشی از یه مصاحبه خوبه و نه تمامش و معمولاً سوالات خیلی سختی پرسیده نمیشه. برای یه نمونه سوال خوب، بد نیست ویدیو زیر رو ببینید که یه سوال ساده در مصاحبه شرکت گوگل هست:
https://www.youtube.com/watch?v=XKu_SEDAykw

Saeed Shahrivari Joghan

#note

@khat_academy
🔥5👍3
مطلبی از لینکدین Saeed Shahrivari Joghan
لینک پست در کامنت

سری مهندسی نرم‌افزار: پست1
اولین پست سری مهندسی نرم‌افزار رو با تعریف خود نرم‌افزار شروع می‌کنم. شاید در نگاه اول تعریف نرم‌افزار برای اغلب افراد کامپیوتری خیلی بدیهی باشه اما بد نیست همین الان بهش فکر کنیم که تعریف نرم‌افزار چیه؟ اغلب بنا به تجربه من تعریفش سخته، چون بدیهیه!
تعاریفی که معمولا من شنیدم یه چیزایی مثل این عباراته:
- مجموعه‌ای از کدهای قابل اجرا توسط کامپیوتر
- هر چیزی به جز سخت‌افزار که باعث اجرای فرمانهای انسان رو ماشین بشه

شاید این تعاریف به صورت حسی و شهودی بد نباشن ولی یه مشکل توی این تعاریف وجود داره و اون هم گم بودن حدود نرم‌افزار در یک سیستمه. طبق تعریف کلاسیک «نرم‌افزار مجموعه‌ای از دستورالعمل‌های قابل اجرا توسط کامپیوتر (یا به عبارتی برنامه) در کنار داده‌ها و مستندات مربوطه است». معمولا طبق این تعریف دو چیز در تعریف نرم‌افزار مغفول می‌مونه اولی مفهوم داده هست و دومی مستندات. اگه به تعریف دقت کنیم نرم‌افزار صرفا کد نیست و داده و مستندات جزیی از نرم‌افزار هستن که دقیقا مثل کد شهروند درجه یک محسوب میشن بنابراین باید برای توسعه و نگهداری داده و مستندات ما فرآیند‌های مهندسی شده داشته باشیم.

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

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

برای اینکه این اصل رو همیشه به ذهن بسپریم میشه همچین معادله ساده‌ای رو داشت:
نرم‌افزار = کد + داده + مستندات

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

عناوین کتاب‌ها:
Software Engineering: A Practitioner's Approach, Pressman
Software Engineering, Sommerville
2👏1