برنامه نویس - اسکرام مستر - DevOps

تله تمرکز بیش از حد بر روی ابزار در اسکرام

همونطور که می دونید اسکرام(Scrum) محبوب ترین فریم ورک Agile (چابک) است

اما انجام صحیحش کار ساده ای نیست!

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

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

حتی اگر ندانند که اصلاً اسکرام چی هست.

اسکرام کِرِم دور چشم نیست که مارک آن مهم باشد!

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

نهایت امر یک Excel نیاز خواهید داشت و لا غیر.

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

۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

تله افراط در مقدمه­ سازی و برنامه ریزی در اسکرام

همونطور که مستحضرید اسکرام(Scrum) محبوب ترین فریم ورک Agile (چابک) است

اما انجام صحیح آن کار ساده ای نیست!

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

افراط در مقدمه­ سازی و برنامه ریزی

قبل از شروع هر اسپرینت در اسکرام، نیازی نیست اصطلاحاً "مته به خشخاش" بذارید و بخواهید در ابتدا همه مقدمات برگزاری اسپرینت آماده باشد تا بعد آن را برگزار کنید.

این موضوع مخصوصاً در اسپرینت اول همواره اتفاق خواهد افتاد.

کار رو شروع کنید و در Sprint Review آنچه که اتفاق افتاده را بررسی کنید.

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

۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

قواعد اسکرام

گفته ها در مورد اسکرام بسیار است

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

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

خود‌‌سازماندهی

روش‌های چابک و اسکرام هر دو برای تیم‌های امروز هستند.

تیم‌هایی که با استفاده از خود سازماندهی (Self Organize) موفق‌ترند و می‌توانند ارزشهای بیشتری عرضه کنند.

خود-سازماندهی، به خرید بیشتر سهام شرکت توسط کارکنان، و تعهد بیشتر اعضای تیم به اهداف می‌انجامد،

چون این خود آنها هستند که اهداف را برای خودشان تعریف می‌کنند.

چارچوب‌بندی زمان

همه ما برای کارهایمان سررسید داریم، و می‌خواهیم سریعتر حرکت کنیم و کارهای بیشتری را به انجام برسانیم.

به همین دلیل زمان در اسکرام یک چارچوب محدود دارد.

تقریبا در تمام عناصر اسکرام راهنماها و محدودیت‌هایی برای زمان بندی پروژه وجود دارد.

پیشرفت مداوم

آیا عالی نبود اگر تیم شما در کاری که انجام می‌دهند و چگونگی انجام آن، هر هفته بهتر از قبل می‌شدند؟

در این روش می‌توانید اطمینان داشته باشید که تیم شما مرتب و به‌ طور سیستماتیک، روند گردش کار خود را بهبود می‌بخشد.

 

 

۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

agile به زبان ساده و معرفی Scrum

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

اما چگونه می توان چابک شد؟

برای چابک شدن باید در پروسه توسعه و یا حتی سطوح کلان سازمان مانند مدیریت منابع انسانی پروژه و یا هر سطحی، ارزش ها و اصول چابک رعایت شوند و در نظر گرفته شوند. به عبارتی باید همه سازمان چابک شود و نه فقط بخش یا واحد توسعه نرم افزار. به همین دلیل حرکت سازمان به سمت Agile را تغییر یا Change گفته نمی شود و از اصطلاح Transformation یا تحول استفاده می شود. یعنی باید سازمان در راه چابک شدن متحول شود.

برای اینکه بتوان به سطحی از چابکی دست یافت می توان از Practice های Agile مانند Scrum , XP , Crystal و یا … بهره جست.

یکی از این متدها اسکرام است

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

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

 

نتیجه گیری

Agile یک تفکر ناب در زمینه توسعه نرم افزار می باشد که خروجی و هدف آن ارائه نرم افزار کارآ می باشد. در Agile هزینه توسعه بدلیل Lean بودن و تحلیل و طراحی سازگار  پایین خواهد بود. در Agile بدلیل Iteration عمل کردن و ارتباط چهره به چهره دائم با مشتری و آزمایش یکپارچه شاهده محصول با کیفیت و کارکننده خواهیم بود. در Agile به دلیل خود سازمانده بودن تیم ها شاهد نفرات و تیم های خوشحال و راضی خواهیم بود. و سازمان نیز بدلیل چابک بودن دارای سود بالایی خواهد بود.

۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

مدیریت منابع انسانی در اسکرام

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

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

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

 

ادامه مطلب...
۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

چرا با توجه به اینکه تنظیمات SMTP درست است ایمیل ارسال نمی شود؟

اگر در زمان ارسال ایمیل در کد خود با این پیام

"The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required"

برخورد می کنید.

لطفا موارد زیر را بررسی کنید

  1. صحت کلمه عبور وارد شده
    (یک بار با همین پسورد مجدد به اکونت خود لاگین کنید.)
  2. زمانی که شما سعی می کنید از یک برنامه جانبی برای اولین بار به حساب کاربری خود وارد شوید
    (برای این کار به حساب کاربری خود در گوگل وارد شوید و به لینک زیر بروید
    https://www.google.com/settings/security/lesssecureapps
    و گزینه اجازه ورود به برنامه های نا امن را فعال کنید (Allow less secure apps: ON)
    بدین صورت شما می توانید از تمامی برنامه ها به حساب کاربری خود وارد شوید.)
  3. در برخی مواقع بدلیل اختلاف زمانی یا IP سروری که برنامه را بروی آن پابلیش کردید این اتفاق رخ می دهد
    (در سرور مورد نظر یک بار به حساب کاربری خود وارد شوید)

۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

توصیه‌های عمومی برای دفاع از حملات CSRF

به‌صورت کلی و عمومی برای دفاع استاندارد و خودکار در مقابل حملات CSRF که نیاز به مداخله کاربر در دفاع نباشد، دو بررسی جداگانه زیر پیشنهاد می‌گردد. در این بررسی‌ها به‌صورت عمدی و خودکار، درخواست مجوز متقابل یا Cross به‌صورت لحظه‌ای و آنی، رد خواهد شد.

·         بررسی هدرهای استاندارد برای تائید درخواست همان منبع

·         بررسی توکن های CSRF

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

·         همگام ساز توکن ها یا Synchronizer Tokens

·         دفاع کوکی‌های دوگانه یا Double Cookies Defense

·         رمزگذاری الگوهای توکن یا Encrypted Token Pattern

·         سربرگ سفارشی یا Custom Header

دیگر راهکارهای موجود برای جلوگیری از حملات CSRF در زیر بیان‌شده‌اند؛ که باید برنامه نویسان و طراحان وب‌سایت‌ها این موارد را در طراحی‌های خود در نظر داشته باشند.

·         استفاده از Captcha در فرم‌ها

·         استفاده از متد POST بجای متد GET

·         تمامی متدهای POST باید بصورت parameter less باشند

·         تمامی درخواست ها همراه توکن به سرور ارسال شود

·         در تمامی درخواست ها نام دامنه چک شود (نام دامنه را در setting نرم افزار قرار دهید)

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

·         پرهیز استفاده از Register_Global در صفحات پردازشگر

·         گرفتن تائید مجدد پس از ارسال یک فرم از کاربر برای انجام فرآیندها

·         ایجاد متغیرهای تصادفی در سمت سرور و بازپس‌گیری آن از طرف کاربر در زمان ارسال هر فرم

·         اجبار کاربر به ورود مجدد رمز عبور قبل از انجام عملیات‌های مهم مثل انتقال پول

·         استفاده از Captcha قبل از انجام عملیات های مهم

·         اطمینان از عدم وجود فایل clientaccesspolicy.xml که موجب دسترسی ناخواسته Silverlight گردد

·         اطمینان از عدم وجود فایل crossdomain.xml که موجب دسترسی ناخواسته Adobe flash گردد

·         در صورتی که بخش مدیریت سایت جداست (مثلا در مسیر admin/ قرار دارد)، می‌توان بخش ادمین را از طریق زیردامنه خاص و غیرقابل حدس یا حتی دامنه دیگر کنترل کرد تا حملات csrf و همچنین xss تا حد بالایی دفع شود.


۰ نظر موافقین ۰ مخالفین ۰
محمدحسین عزتی

۱۲ ترفند بسیار مفید جاوا اسکریپت - قسمت اول

در این پست قصد دارم ۱۲ ترفند مفید از جاوا اسکریپت رو براتون توضیح بدم که با استفاده از اونها کدهاتون کمتر و بهینه تر میشه . 

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

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

۱- تبدیل کردن به boolean با عمگلر !!

گاهی اوقات شما به این نیاز پیدا میکنید که چک کنید آیا مقداری برای یک متغییر وجود دارد یا خیر . یا اصلا اگر وجود دارد مقدار true برگشت داده بشه . برای انجام دادن چنین اعتبار سنجی میتونید از عملگر !! (دو علامت تعجب پشت هم ) استفاده کنید به عنوان مثال !!variable , این حالت به شما کمک میکند تا در صورت اینکه variable شما برابر با مقادیری مثل ۰, null, "", undefined یا NaN بود مقدار false رو در خروجی دریافت کنید یا اگر برابر با هیچ کدوم اینها نبود شما میتونید مقدار true رو در خروجی نمایش بدید . هیچی بهتر از یک مثال خوب برای درک این مسئله نمی تونه به شما کمک کنه به مثال زیر دقت کنید : 


function Account(cash) {  
    this.cash = cash;
    this.hasMoney = !!cash;
}
var account = new Account(100.50);  
console.log(account.cash); // 100.50  
console.log(account.hasMoney); // true
var emptyAccount = new Account(0);  
console.log(emptyAccount.cash); // 0  
console.log(emptyAccount.hasMoney); // false

در این کد اگر مقدار account.cash بزرگتر از ۰ باشد برای شما مقدار true برگشت داده میشود . 

۲- تبدیل به عدد با عملگر +

این واقعا خیلی جالبه و استفاده کردن از اون هم خیلی ساده اما فقط برای حالت های کار میکنه که رشته های شما فقط حاویه عدد باشن در غیر این صورت برای شما مقدار NaN به معنیه (Not a Number) برگشت داده میشه . به مثال زیر نوجه کنید .

function toNumber(strNumber) {  
    return +strNumber;
}
console.log(toNumber("1234")); // 1234  
console.log(toNumber("ACB")); // NaN

این مورد برای Date ها هم کار میکنه و برای شما یک timestamp رو بر میگردونه

console.log(+new Date()) // 1461288164385

۳- شرط های کوتاه

شما قطعا کد زیر را در جاوا اسکریپت دیده اید : 

if (conected) {  
    login();
}

در مثال بالا login تنها در صورتی اجرا میشود که connected برابر با مقدار true باشد اگر شما میخواید چنین بدنه ای را پیداه سازی کنید میتونید کار رو از این هم ساده تر انجام بدید و از عملگر && همون ( AND ) استفاده کنید تا فقط در صورتی که connected برابر true بود تابع login اجرا بشه . به کد پایین دقت کنید . 

conected && login();

 

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

user && user.login();

 ۴ - ثبت مقدار پیشفرض با عملگر || 

امروزه با استفاده از ES۶ میتونید مقدار های پیش فرض رو برای مقادیر مختلف به سادگی تعریف کنید .اما در مرورگرهای قدیمی تر که از ES۶ به خوبی پشتیبانی نمی کنن چه راهی واقعا برای برای تعریف حالت پیش فرض وجود داره . شما میتونید به سادگی با استفاده عملگر || یا همون (OR خودمون ) ، مقدار پیش فرضی رو برای متغیر تعریف کنید در صورتی که مقدار اولی false برگشت بده مقدار دوم داخل متغیر قرار میگیره . به کد زیر دقت کنید : 

function User(name, age) {  
    this.name = name || "Oliver Queen";
    this.age = age || 27;
}
var user1 = new User();  
console.log(user1.name); // Oliver Queen  
console.log(user1.age); // 27
var user2 = new User("Barry Allen", 25);  
console.log(user2.name); // Barry Allen  
console.log(user2.age); // 25

 ۵ - کش کردن array.length در حلقه ها

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

for (var i = 0; i < array.length; i++) {  
    console.log(array[i]);
}

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

var length = array.length;  
for (var i = 0; i < length; i++) {  
    console.log(array[i]);
}

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

for (var i = 0, length = array.length; i < length; i++) {  
    console.log(array[i]);
}

 ۶ - تشخص وجود properties در object

این روش خیلی به ما کمک میکنه تا به سادگی چک کنیم آیا یک propertie در یک object وجود داره یا نه . این موضوع کجا استفاده میشه ؟ جاهای که ما قصد داریم کدهای cross-browser ایجاد کنیم تا در تمام مرورگرها کدهای ما به خوبی کار کند . خوب میشه یه مثال از این حالت بزنی ؟ خوب اره نگاه کنید فرض کنید شما کدی رو دارید ایجاد میکنید که دوست دارید حتی در مرورگر  Internet Explorer ۶ هم اجرا بشه برای مثال میخواید از کد document.querySelector() استفاده کنید اما مطمئن نیستید که این مورد در مرورگر Internet Explorer ۶ وجود داره یا خیر پس باید اول چک کنید که اگر این روش وجود نداشت از روشی استفاده بشه کد های شما به مشکل بر نخوره . باز هیچی بهتر از مثال نیست . به مثال زیر دقت کنید.

if ('querySelector' in document) {  
    document.querySelector("#id");
} else {
    document.getElementById("id");
}

 در این مورد اگر querySelector  در شی document وجود نداشته باشه از مقدار document.getElementById استفاده میشه .

امیدوارم این ۶ ترفند مورد استفاده شما قرار گرفته باشن . منتظر شنیدن نظراتتون هستم . ۶ ترفند دوم رو در پست بعد به شما معرفی میکنم.

۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

چگونه از ایجاد تغییرات در دیتابیس توسط DbContext جلوگیری کنیم

بعد از ایجاد فایل Configuration.cs در پوشه Migrations توسط فرمان enable-migrations دستور زیر را در سازنده کلاس بنویسید 

AutomaticMigrationsEnabled = false;


فرمان enable-migrations بصورت زیر می باشد

enable-migrations -ContextTypeName Repository.PhoneBookContext -MigrationsDirectory:Migrations\PhoneBookContextMigration



تغیرات زیر را در DbContext جهت فقط خواندنی کردن آن اعمال کنید


public class MyReadOnlyContext : DbContext
{
    // Use ReadOnlyConnectionString from App/Web.config
    public MyReadOnlyContext () : base("Name=ReadOnlyConnectionString")
    {
           Configuration.LazyLoadingEnabled = false;
           Configuration.ProxyCreationEnabled = false;
           Configuration.ValidateOnSaveEnabled = false;
           Configuration.AutoDetectChangesEnabled = false;

    }

    // Don't expose Add(), Remove(), etc.
    public DbQuery<PhoneBook> PhoneBooks
    {
        get
        {
            // Don't track changes to query results
            return Set<PhoneBook>().AsNoTracking();
} } public override int SaveChanges() { // Throw if they try to call this throw new InvalidOperationException("This context is read-only."); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Need this since there is no DbSet<Customer> property modelBuilder.Entity<PhoneBook>();
} }
۰ نظر موافقین ۰ مخالفین ۰
محمدحسین عزتی

Normal vs Abstract vs Static vs Sealed Class Difference

+-------------------------+---+--------+--------+--------+----------+
|       Class Type        |   | normal | static | sealed | abstract |
+-------------------------+---+--------+--------+--------+----------+
| Can be instantiated     | : | YES    | NO     | YES    | NO       |
| Can be inherited        | : | YES    | NO     | NO     | YES      |
| Can inherit from others | : | YES    | NO     | YES    | YES      |
+-------------------------+---+--------+--------+--------+----------+
۰ نظر موافقین ۰ مخالفین ۰
محمدحسین عزتی