badrinex بدون دیدگاه

داشتن چه دانشی برای بازار کار مفید است؟

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

هوشمند سازی و اینترنت اشیا:


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

شبکه:


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

مجازی سازی:


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


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

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

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

لینوکس:


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

امنیت:


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

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

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

 

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)  هستید داستان کاملا متفاوت است و تقریبا ربطی به این مطالب ندارد و معمولا مقام آوردن در مسابقات برنامه نویسی نیز کار خیلی سختی است. نکته ی خیلی  مثبت آن  افزایش مهارت ها و بهبود شیوه فکر کردن در حل مساله است که خیلی کمک به برنامه نویس میکند( در هر مقطعی)

موفق باشید