احسان رضایی

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

تماس با من
me@dehohohohovelopithahahaha.ir
کی هستم؟
who am i

کتاب الگوهای طراحی به بیان ساده(design patterns/دیزاین پترن)

در مهندسی نرم افزار، design patterns(الگوهای طراحی) راه حل‌های قابل استفاده برای مشکلاتی هستند که معمولاً در طراحی نرم‌افزار اتفاق می افتند.

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



دست نوشته ها

دانشگاه یا موز!

(مطلب ثابت)

تفاویت بین فریلنسری و دورکاری


work-online-from-home

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

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

تشخیص و دسته بندی آگهی ها در جاب ترند

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

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

انجام این کار به صورت دستی امکان پذیر نیست.

ادامه...

چرا به وب فریمورک های golang نیازی نیست؟

golang-web-freamework
زمانی که golang رو شروع کردم بلافاصله مشغول تحقیق و بررسی وب فریمورک هاش بودم. من قبلا مطلبی در مورد استفاده از فریمورک نوشتم و هنوز هم بر این عقیدم که مزیت های استفاده از فریمورک نسبت به عیب هایی که داره بیشتره. نکته جالب این بود که اغلب مخالف استفاده از فریمورک در go بودن و خب معمولا به جمله ی نیازی بهشون نداری بسنده میکردن.

برای تجربه بیشتر سراغ سه فریمورک gin، echo و روم به دیوار iris رفتم! یه نکته ی خیلی مهم وجود داشت. به نظرم این فریمورک ها به اندازه کافی کامل نیستن و هنگام توسعه زیاد اتفاق میوفته از پکیج های خارجی استفاده کنید. حقیقتا برای validator، router، middleware و error handling که میتونی پکیج هاشُ خودت توی پروژه ات به سادگی اضافه و استفاده کنی، نیازی به فریمورک نداری. در نتیجه تقریبا مزیتی نخواهد موند که از عیب هاش بیشتر باشه. اما پیشنهاد میکنم فریمورک هاشُ برای تجربه هم که شده امتحان کنید.

عدم موفقیت پروژه های نرم افزاری قسمت اول

fail

اجازه بدین قبل از شروع این موضوع آماریُ خدمتتون ارائه بدم.

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

75 درصد مدیران فناوری پیش بینی میکنن پروژه های نرم افزاری اونها شکست میخوره.

- در پروژه های موفق، کمتر از یک سوم اونها با بودجه و زمان مشخص شده به پایان میرسن.

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

1) داشتن شور، اشتیاق، امید و انگیزه. اما تخصص نه!

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

ادامه...

چپ دست ها آدمای خاصی هستن یا چی؟

left hand


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

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

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

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

یادمه این موضوع چپ دست بودن رو به نیم کره های مغز هم ربط میدادن که توجه تون رو به این نقل قول جلب میکنم:

در مطالعه‌ای در سال ۲۰۱۳، تصاویر سه‌بعدی مغز هزار نفر مورد بررسی قرار گرفت و با استفاده از اسکنر MRI، میزان فعالیت هردو نیمکره اندازه‌گیری شد. نتایج نشان می‌داد که هر انسان، از هردو نیمکره مغزی خود بهره می‌برد و بخشی بر دیگری غالب نیست.

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

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

آخرین مطالب وبلاگ

کیو انتخاب کنم کدومو جواب کنم؟

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

در درجه اول اگر به موردی علاقه دارین امتیاز ویژه ای براش در نظر بگیرید چون خیلی توی موفقیت شما موثر خواهد بود.

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

ساده نگهش دار و احمقانه (اصل KISS)

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

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

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

 

 

دیتا تایپ مناسب برای فیلد status در پایگاه داده

گاهی داخل app نیاز به یک فیلد با مقادیر مشخصی داریم. مثل status در جدول payments که میتونه paid یا unpaid باشه. از اونجایی که در پروژه های مختلف این فیلد رو به روش های متفاوتی پیاده میکردن تصمیم گرفتم در موردش کمی بنویسم. به طور کلی سه دیتا تایپ برای این قبیل فیلد ها انتخاب میشن که در موردشون توضیح میدم.

- string/varchar: ساده ترین رویکرد انتخاب دیتا تایپ string هست. وضوح خوبی هم داره. چون هنگام توسعه با یک نگاه به سطر مورد نظرتون متوجه وضعیتش میشید. حتی میتونید توی فرانت دقیقا این رشته رو چاپ کنید(ولی نه توی app های چند زبانه). اما بسته به طول رشته طبیعتا فضایی برای ذخیره سازی در نظر گرفته میشه. هر چند موضوع فضا خیلی وقته به حاشیه رفته و کمتر کسی نگران پر شدن هارد سرورشه، اما اگر سطرهای زیادی داشته باشید هنگام پیمایش اطلاعات، کندی رو حس خواهید کرد. مورد بعدی تغییرات هست. فرض کنید پس از مدتی متوجه غلط املایی در یکی از آیتم ها میشید، تمام سطر ها باید update بشن.

- enum: چیزی که ازش به شدت متنفرم! من دوست ندارم منطق و فرآیند برنامه رو توی دیتابیس ببرم. چرا که مثلا هنگام تغییرات و یا کم و زیاد شدن آیتم ها مجبورم جدول رو هم بروز کنم.

- tinyint: یک رویکرد مناسب برای بهبود سرعت query ها و ملایم در هنگام تغییرات یا افزودن گزینه های بیشتر. نیازی نیست به طور مستقیم با اعداد کار کنید، میتویند از جدول میانی یا ثابت ها بهره برد. من به طور پیشفرض از ثابت ها برای آیتم های کم و جدول در مواقعی که گزینه های زیادی یاا اطلاعات اضافی مثل توضیحات و... داریم استفاده میکنم.

انتخاب هر یک از این روش ها بستگی به شرایط و app شما داره. میتونید string رو برای پروژه های کوچک و اطلاعات کم استفاده کنید. enum توی پروژه هایی که به شما ارث رسیده(یک پروژه قدیمی که مشغول توسعه نسخه جدیدش هستید) و فرآیند ها و منطق برنامه از قبل مشخص هست هزینه تغییرات پایینی داره. tinyint هم زمانی که در یک پروژه بزرگ یا مواقعی که تغییرات زیادی هنگام توسعه اتفاق میوفته کارآمد هست.

استقرار وب اپلیکیشن golang با استفاده از docker-compose

برای deploy روش های زیادی وجود داره که اغلب وارد پیچیدگی هایی میشن. من تصمیم دارم کوتاه و ساده در موردش بنویسم و از تنظیمات جانبی اون صرف نظر میکنم.

در مرحله اول به یک http server نیاز داریم. من خودم مخالف استفاده از فریمورک های golang هستم ولی الان دم دسته و مثال رو با gin انجام میدم. شما هر طور خواستین بنویسید.

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main()  {
	router := gin.Default()
	router.GET("/", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"status": "OK",
		})
	})

	router.Run(":8080")
}

به Dockerfile نیاز داریم. پیشفرض به پورت 8080 گوش میده و app رو اجرا میکنه(پورت http server هم روی 8080 ست شده).

FROM golang:1.13
ENV APP_NAME app
ENV PORT 8080
WORKDIR /go/src/app

CMD ./${APP_NAME}
EXPOSE ${PORT}
ادامه...

جستجو با استفاده از عبارت باقاعده(regex) در elasticsearch

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

مثال زیر اسنادی رو که فیلد user شون با k شروع و با y تموم بشه رو match میکنه.

GET /_search
{
    "query": {
        "regexp": {
            "user": {
                "value": "k.*y"
            }
        }
    }
}

تعریف و جستجو بر اساس الگو با استفاده از wildcard query در elasticsearch

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

? : یک کاراکتر تکی رو match میکنه.

* : صفر یا بیشتر. هر تعداد کاراکترُ match میکنه.

مثال زیر اسنادی رو پیدا میکنه که نویسنده هاشون با حرف t شروع شده باشن.

GET /_search
{
    "query": {
        "wildcard": {
            "authors": {
                "value": "t*"
            }
        }
    }
}