دانش T شکل

اینم یه تجربه پراکنده دیگه!

این یه پست کوتاهه. یه چند وقته که یه کتاب در مورد نحوه کار توی شرکت atumattic میخونم که پشت سایت wordpress.com هست. این شرکت کاملا بصورت دور کاری اداره میشه و افراد زمان‌های بسیار کمی کنار هم کار میکنن و اکثرا دور کاری میکنن. مدیریت این شرکت‌ها و کار کردن توشون کاملا متفاوت از کارکردن توی شرکت‌های عادیه پس قوانین مخصوص به خودشون رو دارن که من سعی میکنم در موردش بنویسم.

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

همین!

همه ایده های من: سرآغاز

اینم یه تجربه پراکنده دیگه!

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

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

اکثر این ایده‌ها، ایده‌هایی هستن که نتیجه وب‌گردی‌های روزانه من هستن یا جواب‌هایی هستن که من سعی میکنم به مشکلات دوستان یا نزدیکانم بدم. بعضی از اون‌های از ترکیب و در کنار هم گذاشتن پروژه‌های متن‌باز و یا تکنولوژی‌های مختلف بوجود اومدن. مهم‌ترین ویژگی مشترک این ایده‌ها این هست که معمولا این ایده‌ها خام هستن و به اندازه کافی پرداخته نشدن. چون اگه به اندازه کافی پرداخته بشن دیگه ایده‌های خاک خورده نیستن و احتمالا من الان دارم توی «آخر هفته‌ها» روش کار میکنم و خودم منتظر یه محصول اولیه ازش هستم.

ممکنه بپرسید چرا من ایده‌هام رو منتشر میکنم؟

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

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

من با جستجوی اندکی که انجام دادم دیدم سایت‌هایی هستن که ایده‌های نوی آدمها توشون منتشر میشه و همه اونها یه هزینه اشتراک دارن و حداقل از این راه پول در میا‌رن. من شخصا از پول در آوردن بصورت عام و بصورت خاص از ایده‌هام بدم نمیاد اما حقیقتا شخصا علاقه‌ای به این کار ندارم. شخصا اعتقاد دارم ایده‌ی من – درسته که به ذهن من رسیده – الزاما تا اجرا نشه خیلی ایده ناب و درخشانی نیست. همچنین اصالتا علم و دانش (که ایده‌ی من هم به نظر خودم بخشی از اون هست) کاملا آزاده و در اختیار همه قرار داره.

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

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

همین!

انتخاب ایده برای‌ اجرا

اینم یه تجربه پراکنده دیگه!

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

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

  1. سرمایه اولیه: منظورم از سرمایه اولیه اینه که شما اگه بخوای این کار رو به بیرون بدی برات انجام بدن یا حداقل به خودت حقوق بدی چقدر پول لازم داری تا کارت شروع بشه. معمولا این مقدار هزینه‌های شروع کار به علاوه‌ی ساعاتیه که من روی این کار وقت میگذارم ضرب در درآمد ساعتی فعلیم
  2. حداقل واحد: کارهای مختلف واحد‌های مختلفی دارن. اگه شما سایت طراحی کنی به منظور از حداقل واحد، حداقل هزینه‌ای هست که به نظرت باید بگیری. اگه آموزش میدی حداقل قیمت ساعتی کلاست هست. اگه قطعه میفروشی حداقل درصد سودی که انتظار داری تا سراغ اون کار بری
  3. حداکثر واحد: منظور حداکثر مقدار سود آوری در اون ایده است.
  4. متوسط تعداد ماهیانه: منظور از این قسمت اینه که شما به چه تعداد می‌تونی در ماه با وضعیت فعلی کار انجام بدی. مثلا اگه قطعه میفروشی چند میلیون میتونی سرمایه گذاری ماهیانه کنی. اگه سایت طراحی میکنی چند تا سایت می‌تونی بصورت متوسط طراحی کنی و …
  5. تعداد ماه در سال: یعنی چند ماه در سال میتونی اون کار رو انجام بدی. خیلی از کارها فصلین. خیلی از کارها بازار دائم ندارن. مثلا اگه شما کلاس خصوصی بگذاری و دروس دانشگاهی رو درس بدی فقط در ۳ تا ۴ ماه در سال میتونی کلاس بگذاری. این محدودیت در خیلی از شغل‌ها وجود داره.
  6. معیار ریسک: یک عدد بین یک تا پنج که یک نشان دهنده حداقل ریسک و ۵ نشان دهنده حداکثر ریسکه

حالا با توجه به این عددها میشه موارد پایین رو حساب کرد:

  1. حداقل درآمد ماهیانه: این عدد به راحتی از حداقل سود ضرب در متوسط ماهیانه بدست میاد که نشان‌دهنده اینه که در کوتاه مدت حداقل انتظار از درآمد ماهیانه از این ایده چقدره
  2. حداکثر درآمد ماهیانه: این عدد نشان‌دهنده اینه که انتظار بیش از این عدد از یک ایده نا معقوله
  3. متوسط درآمد ماهیانه: این عدد نشان‌دهنده اینه که در کل چه انتظاری از این ایده داشته باشی
  4. حداقل در آمد سالیانه: این عدد برابر حداقل در آمد ماهیانه ضرب در تعداد ماه در ساله. یک معیار تقریبا بلند مدت از حداقل در آمده
  5. حداکثر درآمد سالیانه: این عدد میگه که انتظار بیش از این عدد از یک ایده در سال نا معقوله
  6. متوسط درآمد سالیانه: این عد نشان‌دهنده اینه که در کل چه انتظاری از ایده در بلند مدت داشته باشی

حالا اگه شما یه فایل اکسل یا libreOffice Calc درست کنی و این معیارها رو وارد کنی و میتونی با توجه به اون تصمیمات مهمی بگیری.

  1. اولا  میشه یه سری کارها رو از لیستت خط زد. مثلا گفت فلان کار یا بسان کار حداقل در آمد کوتاه‌مدتی رو که اننتظار میره تامین نمیکنه پس به درد نمیخوره
  2. دوما میشه براساس معیارهای مختلف (ریسک، درآمد کوتاه مدت، در آمد بلند مدت) ایده‌ها رو مرتب کرد و از این جهت بهش نگاه کرد.
  3. سوما میشه برای ایده‌های برتر تحقیقات عمیق تری انجام داد
  4. چهارما میشه این فرم رو به آدمهای متخصص داد و از اونها هم نظر گرفت.

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

idea_analysis_1 idea_analysis_2

پیاده سازی iso 8583 در زبان go

اینم یه تجربه پراکنده دیگه!

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

تنها بخش مجهول این بود که من ایده‌ای نداشتم که چطوری پروتکل ۸۵۸۳ رو بصورت بهینه توی این زبان parse کنم که این پروژه‌ها رو پیدا کردم که بهم یکم ایده میدن. گفتم لیستش رو اینجا بنویسم شاید به درد دیگران هم بخوره

https://github.com/jthmath/VirtuaPOSP

https://github.com/paopaol/bank

https://github.com/linphy/iso8583go

https://github.com/dgv/omg8583

چرا لینوکس را دوست دارم: انتقال حجم عظیمی از فایل‌

اینم یه تجربه پراکنده دیگه!

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

خب اول بگم که کل پارتیشن‌های لپ‌تاپ من ext4 بود و نمیشد بدون خراب کردن پارتیشن بندی این انتقال انجام بشه. همچنین حجم کل فایلهای روی لپ‌تاپ من عددی نزدیک به ۸۵۰ گیگا بایت بود که خب عدد بسیار بزرگیه. همچنین باید بگم که کارت شبکه لپ تاپ من متاسفانه ۱۰۰ مگه.

مراحل کارهای انجام شده اینا بود:

  • نصب کردن لینوکس روی لپ تاپ  مقصد
  • نصب samba رو کامپیوتر خودم
  • مونت کردن samba به عنوان یک فولدر در لپ تاپ مقصد
  • و کپی کردن بهینه فایلها با استفاده از rsync

نکته اساس این کار استفاده از rsync هست چون حجم اطلاعات اونقدر زیاده که حدودا ۲۰ ساعت انتقالش طول میکشه. توی این زمان زیاد هزارتا اتفاق ممکنه بیفته از قطع شدن برق تا مشکل شبکه و حتی در موارد خاص قاط زدن سیستم عامل. مزیت rsync اینه که بصورت بهینه کلی فایل رو کپی میکنه و هیچ پیش فرضی نداره که همه انتقال پشت سر هم انجام بشه و انتفاق میتونه قطع بشه و دوباره شروع بشه. همین باعث میشه که من با خیال راحت‌تر انتقال رو انجام بدم و تا الان حدود ۳۵۰ گیگ از اطلاعات رو انتقال بدم و هنوز هم انتقال ادامه داره.

همین!

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

استفاده از pfsense در محیط تجاری/عملیات

اینم یه تجربه پراکنده دیگه

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

اگه به شخص من باشه، من در برای کسب و کارهای کوچک و متوسط پیشنهاد میکنم که از pfSense استفاده بشه. چون کیفیت این محصول خوبه و کنترل کافی روی پهنای باند و شبکه رو فراهم میکنه و نگهداریش سربار اضافی برای اون کسب و کار به همراه نداره. هزینه راه‌اندازی به نسبت  کمی هم داره تنها چیزایی که میخواد یه کامپیوتر قدیمی که دارای حداقل دوتا کارت شبکه باشه هست.

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

از نظر ویژگی‌ها هم کارهای بسیار خوب زیادی میشه باهاش انجام داد. که من لیست کارهایی که باهاش کردم رو مینویسم:

  • سر هم کردن دوتا اینترنت برای افزایش پهنای باند و افزایش ثبات
  • راه اندازی یک captive portal برای احراز هویت کاربران برای دسترسی به اینترنت
  • استفاده از ویژگی NAT برای تخصیص پورتهایی به یکی از سیستم‌های داخلی
  • پشتیبانی از سیستم تلفنی مبتنی بر IP به نام Asterisk
  • پشتیبانی از محدود کردن پهنای باند و ترافیک کاربران
  • محدود کردن دسترسی عده‌ای یا گروهی از کاربران به اینترنت
  • پشتیبانی از squid‌به منظور افزایش کارایی استفاده از اینترنت
  • امکان بررسی ترافیک عبوری و ویروسیابی آن
  • امکان اعمال سیاستهای تضمین کیفیت

این کارهایی که من انجام دادم اکثرا توسط پکیج‌های جانبی این سیستم انجام شده و اگه عمری بود سناریوی اجرای تک تک این قسمت‌ها رو میگم

همین!

redis

redis یک راه جالب برای افزایش کارایی

اینم یه تجربه پراکنده دیگه!

معمولا یکی از مشکلات سیستم‌های تحت وب وجود داره اینه که سرعت دسترسی به دیتابیس بسیار کمتر تعداد درخواستهایی است که برای دسترسی به وب وجود داره و راه‌های بسیاری برای افزایش این سرعت وجود داره. یکی از راه‌ها استفاده از cache هاست که خب در سطوح مختلفی وجود داره. اما یکی از راه‌ها استفاده از redis‌ هست که یک دیتابیس key-value است. بدین صورت که توی redis نتایج تمامی query ها به پایگاه داده ذخیره میشه و این باعث میشه که کارایی سیستم افزایش پیدا کنه.

این دیتابیس جزء پایگاه‌های noSQL هست که فقط یک سری ساختمان داده رو بجای جداول و ستون‌ها دخیره میکنه و کل پایگاه داده توی حافظه است و بصورت متناوب روی دیسک نوشته میشه بدون اینکه در عملکرد پایگاه داده اختلالی حاصل بشه. بخاطر قرار گرفتن پایگاه داده توی حافظه سرعتش خیلی بالاست و کارهای زیادی رو هم میتونه انجام بده. یکی دیگه از ویژگی‌هاش اینه که عملیات‌هاش اتمیک هستن. یعنی اینکه هریک از عملیات‌های پایگاه داده به همدیگه گیر نمیکنن و همدیگه رو بلاک نمی‌کنن و این هم باعث میشه یه عملیات وقت گیر وجود نداشته باشه. همین ویژگی‌ حتی باعث میشه که از اون به عنوان یک message broker هم بشه استفاده کرد بدین صورت که برنامه‌های مختلف اطلاعات رو بصورت کلیدهای مختلف روی این پایگاه قرار میدن و یا برمیدارن اما این عملیات‌ها بدون اختلال ایجاد کردن در کار همدیگه انجام میشه و پایگاه داده تضمین میکنه که کسی که اطلاعات رو پردازش میکنه قطعا به اطلاعات درست دسترسی داره و کارش رو درست انجام میده.

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

همین!

شنا در سطح یا غواصی در اعماق: نیاز به دانایی در بازار نرم افزار ایران

خب اینم یه تجربه پراکنده دیگه

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

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

اما با توجه به برخوردهای من با این دوستان در مجموع به نظر من یک نفر به عنوان فعال نرم افزار بایستی چند تا نکته رو در نظر بگیره:

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

همین!