Drcain ۱ دیدگاه

تست نرم افزار با پایتون

تست سنتی و کلاسیک! 

اکثر برنامه نویس ها از طریق یک پرینت ساده به تست متد و فانکشن ها میپردازند مثلا در مثال قبلی به   خروجی 8 میرسند و به نظر درست میاید ولی چند مشکل دارد

  •   برای اتومات کردن تست نرم افزار کار سخت است و هم چنین برای تست تابع های مختلف
  • به ما خروجی موفق و نا موفق را نمی گوید.
  • نگه داری آن ها در برنامه ممکن است ما را دچار مشکل کند.

پس برای همین است که سراغ Unit test  می رویم.

 

 

 

 

فریم ورک یونیت تست

فریم ورک یونیت تست پایتون، گاهی اوقات با نام “PyUnit”، یک ورژن زبان پایتون از Junit است که توسط کنت بک و اریک گاما نوشته شده است. جی یونیت نیز یک تست فریم ورک ساده در زبان جاوا است.

یونیت تست از ویژگی های مختلفی پشتیبانی میکند مانند automation، setup و shutdown  (همانند setup teardown در جی یونیت)  و اگریگیت  کردن تست ها در کالکشن ها.

یونیت تست برای سادگی کار، متد ها و کلاس هایی را نیز در اختیار میگذارد که تست های زیادی را به راحتی انجام دهیم.

مثال

حال برای نمونه یک ماشین حساب ساده می نویسم و به تست آن میپردازیم.

4 تابع جمع، تفریق، ضرب و تقسیم و نیز یک اکسپشن تقسیم صفر در تابع تقسیم

 

در کلاس تست، یونیت تست دات تست کیس را به ارث میبریم. (قبل از آن کد ماشین حساب و فریم ورک یونیت تست را ایمپورت میکنیم)

با توجه به جمع و تفریق و ضرب و تقسیم متد ها نوشته شده و با استفاده از اسرت ایکوال مقایسه شده.

کد روبرو نیز برای اجرای راحت تر استفاده میشود

if __name__ == ‘__main__’:

    unittest.main()

  (بدون آن باید از -m unittest استفاده کرد)

در نهایت خروجی در شکل روبرو قابل مشاهده است که OK  به معنی موفقیت در تست است.

برای مثال فرض کنید تابع جمع خوب 10 با 5 برابر 14 است  و تابع کم خو 10 با 5 برابر 6

 self.assertEqual(calc.addkhob(10, 5), 14)

self.assertEqual(calc.subtractkhob(10, 5), 6)

تغییرات روبرو را انجام میدهیم(تابع های مربوط در ماشین حساب را نیز تغییر میدهیم)

خروجی را در  میبینیم.

انتظارمان از تابع اددخوب 14 بود ولی 15 خروجی داد و همین طور برای سابترکت خوب که 5 است.

در نهایت 2 تابع فیل شدند.

همین روال در صورت خروج ارور نیز قابل مشاهده است مانند شکل زیر

 

بعضی از ارورها را میتوان با اکسپشن ها هندل کرد  مثلا در تابع تقسیم

raise ValueError(‘Can not divide by zero!’)

  را داشتیم. که در حالت عادی با اسرت ایکوال به ارور میخوریم درصورتی که برنامه کاملا درست است!

راه حل استفاده از متد اسرت ریزز مانند روبرو است.

که مانند حالت درست پیام Ok را نمایش میدهد.

with self.assertRaises(ValueError):

            calc.divide(10, 0)

 

اگر ارور ریز نشود طبیعتا AssertionError: ValueError not raised را خواهیم داشت.

  • شما میتوانید از متد های متنوعی استفاده کنید ولی من با توجه به نیاز از اسرت ایکوال استفاده کردم
  • Document

موفق باشید

Drcain بدون دیدگاه

پرسش و پاسخ برنامه نویسی!

سلام.

یه سری نکات تو مطلب برنامه نویسی و استخدام مطرح شد به نظرم اومد که تو یه شماره چند تا سوال برنامه نویس خوب هم داشته باشیم. خب بریم سراغشون!

 

1- فرق abstraction با encapsulation ?

خیلی ساده با یه مثال روشن میشه.

در کپسولیشن شما عملا دسترسی به بافت قضیه ندارید ولی در ابسترکشن دارید مثل تلویزیون و ریموت کنترل.

ریموت کنترل یه ابسترک ساده میتوان در نظر گرفت که کاربر بدون دانش از این که داخل آن چه خبر است استفاده میکند(ولی میتواند دسترسی بگیرد)

اما تلویزیون هیچ ایده ای از این که فیلم و آهنگ و … پخش میشود نداریم(حداقل فرض کنیم دسترسی محلی نداریم) و دسترسی هم نداریم و صرفا از آن استفاده میکنیم.

2- فرق interface با abstract?

از نظر مهندسی نرم افزار هیچ فرقی این دو مفهوم ندارند. به طور کلی یک ایده دارند ولی از نظر برنامه نویسی یه سری تفاوت دارند مثلا در متغیر و داستان وراثت تو اینترفیس و پیاده سازی توابع و ….

 

3- برنامه نویس سمت سرور هستید و پاسخ هایی همیشه ثابت هستند چه کار میکنید؟

از دیتابیس های جدید مثل ردیس استفاده میکنیم. راه حل ساده تر (در صورت کم بودن متغیر ها ) تعریف آن در چند متغیر و استفاده با رم (همان مفهوم ردیس است)

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

حال چرا اطلاعات در رم نیست ؟ چون حجم اطلاعات خیلی زیاد است و هزینه ساخت و داشتن رم خیلی بیشتر از هارد است.

  • ممکن است فک کنید که اگر سیستم خاموش شود چه پیش می آید یا اطلاعات رم میپرد؟ پاسخ منفی است و ردیس یک بکاپ میگیرد و مثل دیتابیس های معمولی در هارد ذخیره میکند و نگرانی ندارد !

4- برنامه نویس سمت سرور هستید چه راهکارهایی برای ریکوئست های الکی میدهید ؟

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

5- اطلاعات محرمانه ای به روی کلاینت داریم چگونه جلوی دسترسی آن را میگیرید؟

مهندسی معکوس و جلوگیری آن باز هم مبحث گسترده ای است ولی ساده ترین ایده ای که پاسخ این مسئله را میدهد رمزنگاری و سالت است.

یعنی تقریبا کاری که بعضی از اپلیکیشن های موبایلی یا تحت وب انجام میدهند. شاید تضمینی هم در کار نباشد!

6- OOP را تعریف کنید و مزایا و معایبش را بگید؟

برنامه نویسی شی گرا برای راحتی برنامه نویس  و مهندسین نرم افزار است مزایای فراوان که دارد و هر کدوم کاربرد خودش ولی در حالت کلی فانکشنال نوشتن به مراتب زمان بیشتری میبرد. معایب آن در عملکرد است. مثلا اگر محدویت زیادی در رم و cpu و … داشته باشیم گزینه ی مناسب قطعا OOP نیست.

تعریف خیلی ساده هم  که میتوان گفت وقتی یه سری رفتار ها و داده های یکسان و قابل تعریف در یه موضوع داریم میتوان سراغ OOP برویم مثل کلاس حیوان و مثلا وراثت کلاس انسان از حیوان.( به فرض یک بازی open world داریم)

البته OOP و معماری ها و چارچوب خیلی مفصل هستند ولی در همین حد هم در حداقل مصاحبه ها به نظرم کافی باشه.

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

7- کلاس های یک بازی شطرنج یا بولینگ یا .. را طراحی و پیاده سازی کنید ( معمولا 40 تا 60 دقیقه زمان)

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

تو کلاس ها  و معماری باید یه سری موارد را رعایت کنید مثل coupling cohesion یا single responsibility و …

 

8- پیچیدگی الگوریتم … چه قدر است ؟

حتما باید مبحث پیچیدگی را مسلط باشید و بدانید الگوریتم های مورد استفاده شما چگونه عملکردی دارند. ممکن است سوالات ساده ای پرسیده شوند مثل ادغام دو آرایه نا مرتب در یک آرایه مرتب یا پیاده سازی یک الگوریتم مرتب سازی ساده، صف ، استک، لینک لیست، گراف و ….

که در نهایت شما باید بدانید چرا الگوریتم را پیشنهاد دادید و پیچیدگی چگونه است.

اگر شما هیچ اطلاعی درباره پیچیدگی الگوریتم ندارید معمولا بدترین حالت را با O  نمایش میدهند و میگن و از log n تا پیچیدگی های نمایی می تواند راه حل مسائل باشد.

مثلا اگر شما یک آرایه 100 تایی دارید و میخواهید آن را پرینت کنید.100 بار عمل خواندن + 100 بار پرینت دارید. یعنی در اوردر n است.(پیچیدگی زمانی)

پیچیدگی مکانی هم داریم که باید محاسبه ذخیره متغییر ها را حساب کرد.( که مثلا رم چه قدر نیاز است)

 

احتمالا متوجه هستید که مثلا الآن با قضیه ی سیستم های distribute مشکلات cpu را حل کرده اند ولی کمبود رم و پیچیدگی نمایی رم را کاری نمیشود کرد.

مثلا الگوریتمی در بدترین حالت 1 سال طول میکشه خب صبر میکنیم هسته و سیستم زیاد میکنیم و به فرض به 2 ماه کاهش میدهیم ولی وقتی رم خیلی بالایی بخواهد کار به مراتب سخت میشود یا حتی نشدنی.

 

این مدل سوالات رو معمولا تو مصاحبه های ایرانی میبینید. یه چیز جالبی که هست وقتی یه تکنولوژی جدیدی میاد و معروف میشه سریع همه از اون سوال میکنن و یه خورده کار مارو هم سخت میکنه. مثلا یه مدتی برا برنامه نویسی سمت سرور از mongo db سوال میکردن در صورتی که نیازی نداشتن! یا مثلا اخیرا چند جا سوال میکردن آقا مدل اسنپ را چند روزه میزنی  و چجوری ..(!)

نمونه سوالات  در گیت هاب و سایت های مختلف موجوده و زیاد هستن چه برا تمرین برنامه نویسی و الگوریتم و OOP چه مصاحبه و چیزای دیگه

موفق باشید

الهام عابدی بدون دیدگاه

زورآزمایی دو رقیب وب ساز(php و ASP.net)

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

Drcain بدون دیدگاه

آموزش زبان PHP-قسمت ششم(تابع و رشته)

سلام قسمت ششم آموزش php رو در کنار هم هستیم.

ابتدا به معرفی بیشتر رشته ها میپردازیم و در نهایت با تابع ها کاربردی تر برخورد میکنیم.

متغییر گیک را به صورت رشته ای تعریف کردیم و سپس طول رشته را بدست می آوریم.

 

تعداد کلمات در رشته را بدست می آوریم.

معکوس رشته را نمایش میدهیم.

جایگاه قیبله در رشته را خروجی میگیریم(از 0 تا n شماره گذاری میشود مانند آرایه ها)

 

و با استفاده از دستور بالا میتوان بجای کلمه Hello، کلمه ی bye را در ورودی دوم جایگزین کرد.(در متغییر گیک) – شبیه find و replace

سپس به آشنایی بیشتر با تابع پرداختیم.

خروجی تابع بالا صرفا یک نمایش و اکو کردن است در صورتی که ما معمولا در برنامه نویسی به return کردن نیاز داریم و با مثالی آن را به وضوح حس کردیم.

 

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

نشان هم دادیم که به دو تابع با اسم یکسان به مشکل برمیخورد و از نظر کامپایل کردن امکان پذیر نیست.( چه با آرگومان یکسان و چه متفاوت)

 

موفق باشید

 

Youtube / Telegram / TorrentAparat

 

 

 

Drcain بدون دیدگاه

برنامه نویس خوب

 

 

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

اما واقعا چه چیزی شما رو از یک کدزن معمولی به یک برنامه نویس خوب متمایز میکند؟

 

1.  مهارت های فنی چشمگیر

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

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

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

 

2. تمایل به یادگیری(گیک بودن خودمون!)

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

مشابه در مصاحبه: چه چیزی مهارت های شما در برنامه نویسی را به روز نگه میدارد؟

 

3.مهارت دیباگ کردن

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

مشابه در مصاحبه: چگونه باگ های در برنامه خود را درست می کنید؟

مصاحبه عملی: کد دارای باگ داده شده و زمانی برای حل آن دارید.

 

4.عادت های محیطی در برنامه نویسی

بعضی از برنامه نویس ها تمرکز در سکوت مطلق دارند بهتر است که در هنگام مصاحبه به آن ها گفته شود چرا که بعضی از محیط های کاری این محیط را ندارند. (البته اگر بتوانید عادت خود را تغییر دهید بهتر است!)

مشابه در مصاحبه: توصیف محیط کار مناسب شما

 

5. مهارت های حل مسئله

یکی از مهم ترین مهارت های برنامه نویس حل مسئله است. برنامه نویس باید راه های بهتر را بیابد و برای کار کردن موثر برنامه تلاش کند. در غیر این صورت میشنوید که نه ! این از این بهتر امکان ندارد نشدنی است.

مشابه در مصاحبه: سوالی مطرح میکنند و شما باید برای پاسخ آن راه حل ارائه دهید.

 

6. تنبلی

لری ول نویسنده ی کتاب برنامه نویسی پرل 3 توصیف برای برنامه نویس خوب دارد.

تنبلی و خستگی و مغرور!

تنبلی شاید در نگاه اول برای استخدام بد باشد ولی معمولا مدیران میگویند که فرد تنبل سریع ترین راه را پیدا میکند. کمپانی ها دنبال برنامه نویس برای خودکار کردن فرایند ها و ذخیره زمان و پول هستند.

مشابه در مصاحبه: یک نمونه از کارهایی که کمک در بهبود فرایند و زمان داشت را توضیح دهید.

Drcain بدون دیدگاه

برنامه نویسی و سرگرمی

احتمالا اسم  ACM را شنیده اید. یک رقابت از نوع برنامه نویسی! لذت مسابقات برنامه نویسی در حل سوال است و به نوعی گیک بودن تو  کدنویسی رو طلب میکند. روال کار خیلی سادست و شما کافیه داخل هر سایت programming contest عضو بشوید و شروع به حل مسأله کنید. یکی از سایت های در حال پیشرفت ایرانی کوئرا است و معروف ترین سایت خارجی نیز codeforces.

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

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

از مباحث مهم و غیر قابل گریز گراف است! که حداقل ۲ سوال در هر مسابقه مرتبط با گراف است. با استفاده از دانش از رشته ها , مرتب سازی , جست و جو  و الگوریتم های greedy معمولا قادر به حل ۲ تا ۳ سوال هستید. معمولا سخت ترین سوال ها نیز در dynamic programming مطرح میشود که هم ایده حل سوال سخت است و هم نیاز به درک عمیق به حل مسائل بازگشتی و داینامیک دارید.

در هر حال اگر به زبان خاصی تسلط دارید احتمالا حل ۳ سوال کار سختی نباشید.

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

یعنی با رشته ها آشنا شوید و مثلا با پایتون شروع به حل مسائل رشته در سایت codeforces کنید. با مرتب سازی ها آشنا شوید به همین ترتیب و جست و جو و گراف و روش های داینامیک و بازگشتی… آشنایی با مسا‌ئل NP و در نهایت نظریه بازی ها.

به صورت کلی هم از نظر زبانی با سینتکس یا پیاده سازی صف و درخت و استک و هیپ و لیست و آرایه و … حتما آشنا باشید(‌ یا بشوید!) از نظر دانش ریاضی آشنایی با نظریه اعداد و ترکیبیات  و ماتریس و … هم کمک میکند.( همان مطالبی که در ریاضیات گسسته آشنا میشویم! در نهایت هم میتوان به صورت تخصصی از آمار و احتمال و ریاضی در زمینه های به روز هوش مصنوعی مثل  یادگیری ماشینی استفاده کرد.

البته اگر به دنبال طراحی سایت(به طور کلی  developer)  هستید داستان کاملا متفاوت است و تقریبا ربطی به این مطالب ندارد و معمولا مقام آوردن در مسابقات برنامه نویسی نیز کار خیلی سختی است. نکته ی خیلی  مثبت آن  افزایش مهارت ها و بهبود شیوه فکر کردن در حل مساله است که خیلی کمک به برنامه نویس میکند( در هر مقطعی)

موفق باشید