وقتی کسی در حوزهٔ توسعهٔ وب ورود پیدا میکند، اگر واقعاً علاقمند به بکاند باشد، خواهناخواه دستی هم در فرانتاند پیدا خواهد کرد و بنده هم از این قاعده مستثنی نبودم. به عبارت دیگر، برای رفع نیاز زبانهای CSS ،HTML و JS رو یاد گرفتم تا نیازم به دولوپرهای فرانتاند در کارهای دَمدستی به حداقل برسد (ولی خب مسلماً برای کارهای حرفهای در طراحی UI اصلاً حرفی برای گفتن ندارم.) این توضیح را دادم تا به تأثیرات کدنویسی در سبک زندگیام در دو بخش کاملاً متمایز اشاره کنم:
- تأثیراتی که کدنویسی فرانتاند در لایف استایلم داشته است
- و تأثیراتی که کدنویسی بکاند منجر شده
تأثیرات حوزهٔ فرانتاند در سبک زندگیام
در یک کلام، میتونم بگم کار در این حوزه به معنای واقعی کلمه زندگی را برایم دشوار ساخته است که برای روشنتر شدن این موضوع، در ادامه چند مثال واقعی عرض خواهم کرد.
در شرکتی مشغول به کار بودم که به معنای واقعی کلمه کمتری دولوپری را در آنجا میشد یافت که به کار باکیفیت معتقد باشد و این قضیه تا جایی پیش رفته بود که جملگی بنده رو که به قول معروف Product Owner یک سایت بودم مسخره میکردند و برچسب Mr. Pixel رویم زده بودند چرا که میگفتم مثلاً «چرا مارچین سمت راست چند پیکسل بیش از مارجین سمت چپ است؟»
اساساً پس از اینکه چند سالی در حوزهٔ فرانتاند کد زدم، به طور ناخودآگاه به وسطچین بودن هر چیزی وسواس پیدا کردم به طوری که مثلاً وقتی یک بار رفتم گلفروشی تا یک گلدان بخرم، اصرار داشتم که گل باید وسط گلدان باشد و جالب اینجاست که فروشنده طوری بنده را نگاه میکرد که گویی یک دیوانه دیده!
پس از فعالیت در این حوزه، چیز دیگری که خیلی توجهم را به خود جلب میکند، تایپوگرافی است. مثلاً وقتی که میبینیم یک شرکت معروف در بنر خود وسط اتوبان همت نیمفاصله را رعایت نکرده، متعجب میشم و یا وقتی که میبینم طراح یک کتاب یا بروشور نمیدونسته که چهطور باید از فونتهای به اصطلاح Serif و Sans-serif استفاده کنه، این رو توهین به شعور خودم میدونم که چنین کتابی رو در دست گرفتهام و دارم میخونم یا الان که دارم به کتابخانهام نگاه میکنم، کتابی رو میبینم تحت عنوان «بیگانه» اثر آلبر کامو ولی مثلاً در معرفی مترجم نوشته:
مترجم : محمد ثقفی _ زهرا حنیفه پور
به عبارتی، علامت : باید به کلمهٔ مترجم چسبیده باشد، یک فاصله پس از آن قرار گیرد سپس محمد ثقفی بیاید. همچنین پس از محمد ثقفی دو اسپیس قرار گرفته سپس یک علامت _ آمده سپس یک اسپیس قرار گرفته و زهرا حنیفه پور آمده است که این درست نیست بلکه دو طرف _ باید فاصلهٔ یکسانی داشته باشد. همچنین به جای علامت _ که آندراسکور گفته میشود، برای جدا کردن دو مترجم، گرافیست میبایست از علامت - یا دَش استفاده میکرده که ظاهراً از این موضوع آگاهی نداشته است و برسیم به نکتهٔ آخر که زهرا حنیفه پور که مابین دو بخش فامیلی مترجم به جای فاصله میبایست نیمفاصله قرار میگرفت. ورژن درست این هست:
مترجم: محمد ثقفی - زهرا حنیفهپور
گفتم نیمفاصله یاد خاطرهای افتادم. رفته بودم یکی از این دفاتری که آگهیفوت چاپ میکنند تا یک آگهیفوت سفارش دهم. جایی که طرف نام اقوام را نوشته بود که از تشریففرمایی ایشان تشکر شود، گفتم که برخی فامیلیها باید بینشون نیمفاصله باشد. دیزاینر گفت نیمفاصله دیگه چیه؟ براش توضیح دادم اما نهایتاً نتونست تایپیش کنه و من هم چون کاربر ویندوز نبودم، واقعاً بلد نبودم که کلیدهای ترکیبیاش چه میشود به طوری که مجبور شدیم تا با کم/زیاد کردم اسپیسها این حالت رو ایجاد کنیم. جدای از تألمات روحی که داشتم، خیلی افسوس خوردم که اینقدر سطح سواد گرافیکی برخی افراد که خود را گرافیست مینامند پایین است که حتی نمیدانند نیمفاصله چیست!!!
فرانتاند دولوپر بودن در حین خرید جهزیهٔ ازدواج هم کار دستم داد به طوری که منجر به دعوا مرافه در پروسهٔ تحویل گرفتن سرویس مبدل و میز توالت و ... شد. وقتی که رفتم محصولات چوبی رو تحویل بگیرم، دیدم که آقای نجار ... اصلاً بویی از وسطچین کردن اِلِمانها نبرده و قاطعانه چیزی که ساخته بود رو ریجکت کردم و چون بخشی از پولش مانده بود، مجبور شدن که دوباره درستش کنن. برای بار دوم که مراجعه کردم سرویس رو تحویل بگیرم، دیدم که باز هم مشکل داره اما از آنجایی که بیش از این زمان نداشتیم، مجبور شدم چشمانم رو روی مشکل ببندم، کالا رو تحویل بگیرم و در دل هرآنچه که بلد بودم به فروشنده نثار کنم!
تأثیرات حوزهٔ بکاند در سبک زندگیام
اما برسیم به اصل موضوع و آن هم چیزی نیست جز تأثیراتی که پس از ورود به حوزهٔ توسعهٔ نرمافزار و کدنویسی بکاند در لایف استایلم شکل گرفت که به مراتب گستردهتر از تأثیراتی است که کدنویسی در حوزهٔ رابط کاربری برایم داشته است که سعی میکنم به صورت دستهبندی شده نکات رو عرض کنم.
مالتی تردینگ
بدون شک این خصیصه پس از اینکه دولوپر بکاند شدم بسیار در سبک زندگیام پررنگ شد. به عبارتی، علاقهٔ شدیدی به این پیدا کردم که در آنِ واحد که دارم کاری را انجام میدهم، همزمان کار دیگری هم به پیش رود تا در زمانم صرفهجویی شود (گرچه زبانی که با آن کد میزنم، PHP، این فیچر را ندارد، اما ویژگی مالتی تردینگ چیزی است که همیشه دوست داشتهام در حین کدنویسی با این زبان به کار گیرم!) برای روشنتر شدن این مسئله، چند مثال میزنم.
وقتی که میخواهم باشگاه بروم، باید در شِیکِر چیزی درست کنم و با خود ببرم که ضعف نکنم. اگر قبلن بود، خب در پروسهای خیلی خطی اول از یخچال سامسونگ (نام برند بردم چون من کسی هستم که اگر کالای ایرانی از کیفیت خوبی برخوردار نباشد، اصلاً اصراری به حمایت از تولیدکنندهٔ داخلی ندارم!) یخ داخلش میریختم، سپس کمی آب داخل یک لیوان ریخته، داخل مایکروفر سامسونگ میریختم و سی ثانیه میگذاشتم تا گرم شود، سپس دو قاشق عسل داخلش ریخته و آن را حل میکردم و داخل شِیکِر میریختم و با کمی آبلیمو معجون رو درست میکردم اما ...
اما وقتی که به مرور تفکر آسینکرونوس در من شکل گرفت، نحوهٔ شربت آبلیمو درست کردنم هم تغییر کرد به طوری که ابتدا لیوان آب را داخل مایکروفر میگذارم تا گرم شود و در این مدت شروع به ساخت دیگر مراحل میکنم تا در آنِ واحد دو کار یا بیشتر در حال Done شدن باشد.
یا اگر شما خواننده این مطلب تجربهٔ سوار شدن 206 رو داشته باشید، میدونید که شیشهٔ سمت راننده با یک با Long Hold به صورت کامل شروع به بسته شدن میکند اما این در حالی است که شیشهٔ پنجرهٔ سمت شاگرد اینطور نیست و برای اینکه آن را ببندید باید دائم ضامن را نگاه دارید. خب قبلاً اول با حوصلهٔ تمام شیشهٔ سمت شاگرد را میبستم سپس شروع به بستن شیشهٔ سمت راننده میکردم اما وقتی که تفکر آسینکرونوس در من شکل گرفت، اصرار عجیبی دارم که اول ضامن سمت راننده را یک بار لانگ هولد کنم تا به صورت خودکار شروع به بسته شدن کند، سپس مادامی که در حال بسته شدن هست، شروع به بستن شیشهٔ سمت شاگر کنم؛ به عبارتی، در آنِ واحد دو Thread در حال اجرا است و این خیلی لذتبخش است!
شکاک بودن
در صنعت توسعهٔ نرمافزار مفهومی داریم تحت عنوان Defensive Programming که به طور خلاصه میگه در حین کدنویسی باید به همهچیز شک کنی که برای کسب اطلاعات بیشتر میتونید به مقالهٔ آشنایی با مفهوم Defensive Programming در صنعت توسعهٔ نرمافزار مراجعه کنید.
نمیدونم چرا پس از اینکه دولوپر بکاند شدم، کلاً به همهچیز و همهکس شکاک و بدبین شدم! مثلاً وقتی که کسی خبری سیاسی یا اقتصادی بهم میدهد، اگر آن خبر برایم مهم باشد، هرگز گوسفندوار آن را قبول نمیکنم بلکه حتماً خودم باید از منابع معتبر آن خبر را چک کنم یا وقتی که برای خرید هر نوع کالایی اقدام میکنم، هرگز به چیزی که فروشنده میگوید دیگر اعتماد ندارم بلکه خودم باید بروشور محصول رو بخونم، در موردش سرچ کنم و ...
به نظرم این شکاک شدن به دلیل ماهیت حوزهٔ توسعهٔ نرمافزار است. در واقع، وقتی شما کدی میزنید و آن را بارها و بارها در سناریوهای مختلف چک میکنید و همه چیز درست است غافل از اینکه یک شرایط بسیار نادر و خاص رو از قلم انداختهاید و قانون مورفی در کدنویسی گریبان شما را میگیرد، به صورت کاملاً ناخودآگاه این پارادایم در ذهنم شکل میگیرد که همواره ممکن است یک سناریویی وجود داشته باشد که بر علیه من کار کند (برای آشنایی بیشتر با مفهوم پارادایم، به مقالهٔ پارادایم چیست و پارادایمها چگونه در ذهنمان شکل میگیرند؟ مراجعه نمایید.) که همین مسئله منجر شده تا به اطرافیانم در ۹۹٪ موارد بیاعتماد باشم و هرآنچه بر زبان میآورند، هر لطفی که میکنند و هر فیدبکی که از خود در برابرم نشان میدهند را مثبت تلقی نکرده و به این فکر کنم که شاید ۱٪ ظاهر و باطن با هم فرق داشته باشند.
لاگگیری
در سکان بارها و بارها در مورد لزوم Logging مقالاتی نوشته شده مثل مقالهٔ آشنایی با مفهوم Structured Logging در توسعهٔ نرمافزار و این مسئله پس از برنامهنویس شدن، در زندگی غیرکاریام خیلی نمود عینی پیدا کرده است. به عبارتی، دائم در حال لاگگیری از محیط پیرامون خود، چیزها، آدمها و ... هستم. مثلاً وقتی کسی چیزی میگوید، این لاگ در ذهنم میماند و اگر روزی همان فرد چیزی خلاف چیزی که گفته بود بگوید، یک کوئری میزنم به دیتابیس و بهش نشون میدم که دیتا ضد و نقیض است.
وسواس فکری
اگر خیلی خلاصه بخواهیم وسواس (Obsession) را تعریف کنیم، بایستی بگوییم وقتی که ما دائم به چیزی فکر میکنیم و بخشی از ذهن ما را درگیر خود کرده، به نوعی به وسواس فکری دچار شدهایم و ممکن است کسانی که به حوزهٔ نرمافزار ورود پیدا میکنند، کلاً آدمهای وسواسی شوند (مثلاً کسی که وسواس تمیزی دارد، دائم بخشی از ذهنش درگیر این موضوع است که آیا دستانم تمیز هستند یا خیر و این قضیه تا جایی پیش میرود که زندگی فرد مختل شده و باید به مشاور برای درمان خود مراجعه کند.)
متأسفانه/خوشبختانه پس از اینکه آدم به حوزهٔ بکاند ورود پیدا میکند، این احتمال وجود دارد که دچار وسواس فکری شود چرا که ماهیت این کار میطلبد. در واقع، برای اینکه شما برنامه را به اصطلاح Bug Free کنید، Performance را به حد اعلا برسانید و UX خوبی برای کاربران رقم بزنید، باید به چنین وسواس دچار باشید اما خبر بد اینکه به مرور این وسواس در دیگر جنبههای زندگی شما هم ورود پیدا میکند.
مثلاً وقتی در یک مهمانی هستید، دائم هر آنچه بر زبان میآورید رو دارید Recheck میکنید تا بررسی کنید آیا گزارهای که گفتم درست است یا نه؟ آیا چیزی که گفتم منجر به رفتن آبرویم میشود یا نه؟ چیزی که گفتم در ذهن بقیه آدمها به چند نوع مختلف میتونه تفسیر بشه؟ و چیزهایی از این دست و این مسئله ممکنه گاهی به معنای واقعی کلمه آزاردهنده شود.
بدبین شدن به دولوپر جماعت
ممکن است چیزی که در ادامه میخواهم عرض کنم کمی به مذاق خوانندگانی که دولوپر هستند و روی خود تعصب دارند خوش نیاید؛ فلذا پیشاپیش عذرخواهی میکنم و عرض میکنم که اصلاً قصد توهین و ناسزا ندارم بلکه این فقط یک تجربهٔ شخصی است که میتوانند ۱۰۰٪ اشتباه باشد.
پس از اینکه به صنعت توسعهٔ نرمافزار ورود پیدا کردم، مسلماً مجبور به تعامل با دیگر دولوپرها، هم آنهایی که از من بالاتر بودن و هم آنهایی که پایینتر بودند، شدم و روی هم رفته این ایماژ برایم شکل گرفته که دولوپر جماعت در یک حالت کلی اصلاً قابلاعتماد نیست تا جایی که با خود میگویم اگر روزی خدا بهم یک دختر بده، اگر دولوپری به خواستگاریاش بیاید احتمال اینکه بهش دختر بدهم خیلی کم خواهد بود! متأسفانه باید عرض کنم که بارها و بارها با طناب دولوپرهایی که برخی خودگیکپندار بودند به تَه چاه رفتهام، آبرویم رفته، بیاعتبار شدهام و هزار داستان دیگر.
سولوشن یافتن و حل مسئله
خب توسعهٔ نرمافزار به تعریفی یعنی یافتن یک سولوشن (راهحل) برای مشکلی که وجود دارد. به عبارتی، میتوان گفت که وقتی در حال کد زدن هستیم، دائم در حال حل مسائل مختلف میباشیم و از قضا، از این کار هم لذت وافری میبریم.
اساساً اگر اطرافیان به یک دولوپر، بهخصوص دولوپر بکاند، بگن که مثلاً تو از عهدهٔ فلان کار برنمیآیی، گویی به وی فحش رکیکی دادهاند و دولوپر هم برای اثبات نادرست بودن حرف ایشان، خود را به هر آب و آتیشی میزند تا یک راهکار خوب ارائه دهد اما همین مسئله باعث میگردد که این توهم برای برخی دولوپرها منجمله خودم ایجاد گردد که «میتونی برای هر نوع مشکلی راهحل ارائه بدی» و همین تفکر منجر بدین خواهد شد که گاهی اوقات هم خودت و همه بقیه رو به باد بدی!
تفکر الگوریتیمک و تفکر انتقادی
تفکر انتقادی یا Critical Thinking اصلاً ربطی به نقد و انتقاد و اینطور مسائل ندارد بلکه حاکی از آن است که به مسائل از زوایای مختلفی نگاه کنیم و چیزی که آدمهای سادهنگر نمیبینند را ببینیم. یکی از خوبیهای ورود به حوزهٔ نرمافزار این است که تفکر الگوریتیمک و تفکر انتقادی در آدم شکل میگیرد به نظرم هرچه زبانی که با آن کد میزنیم سطح پایینتر باشد (مثلاً زبانهای C و ++C)، میزان این نوع تفکر بیشتر میشود چرا که در این دست زبانها چیزهایی که دولوپر باید شخصاً هندل کند به مراتب بیشتر از زبانی همچون Java است.
در واقع، تفکری بدین شکل منجر میگردد تا دائم به دنبال پرفورمنس بهینهتر باشی که به نظرم خصیصهٔ خیلی خوبی است. یک مثال میزنم برای روشنتر شدن این موضوع. وقتی میروم اراک، خواه از جادهٔ تهران-قم بروم و خواه تهران-ساوه، یک عوارضی سر راه هم هست. جالب اینجاست که به صورت خیلی ناخودآگاه این مدل فکری در من شکل گرفته که حدودا پانصد مانده به عوارضی، شروع میکنم به رصد کردن ردیفهایی که ماشینها ایستادهاند تا ببینم کدام صف زودتر وجه را پرداخت کرده و میرود. مثلاً شاید در ظاهر یک صفی که در آن سه اتوبوس قرار گرفته و چند خودروی سواری به مراتب طولانیتر یا برابر با صفی باشد که جملگی سواری هستند، اما با فکر کردن به این موضوع که هر اتوبوس طولش برابر با حداقل سه الی چهار سواری است و با این تفاسیر به مراتب زودتر صف خالی میشود، خیلی راحت لاینی که زودتر به پیش میرود را انتخاب میکنم.
یا این قضیه در مورد صف پمپ بنزین هم صادق است به طوری که مثلاً وقتی که میخواهم یک لاین را انتخاب کنم، با مد نظر قرار دادن این نکته که فرض کنیم باک همه خالی باشد، با در نظر گرفتن نوع ماشینها صفی را انتخاب میکنم که جمعجبری حجم باکها آنها کمتر باشد. مثلاً خوب میدانم که یک بیوک حداقل 80 لیتر بنزین باید بزند یا یک لند کروزر به مراتب حجم باکش از پراید بیشتر است؛ فلذا صفی را انتخاب میکنم که تعداد ماشینهایی با حجم باک کمتر داخلش باشد اما ...
اما قانون مورفی اینجا هم در ۹۰٪ مواقع کار دستم میدهد و گرچه الگوریتم من درست هست، اما خروجی همیشه چیزی دیگری است چرا که مثلاً صفی که انتخاب کردهام یا پمپ وسط کار خراب میشود، یا صاحب ماشین با متصدی پمپ بنزین دعوایش میشود، یا یک پیرمرد اسلوموشن هست که کلی طول میکشه پول رو حساب کنه و هزار چیز دیگر که منجر شده هیچوقت الگوریتمم کار نکند!
گریزان شدن از آدمها
وقتی واژهٔ Developer را گوگل میکنیم، میبینیم تصاویر آدمهایی که در تنهایی و تاریکی نشستهاند و دارند کد میزنند در معرض دیدمان قرار میگیرد. گرچه توسعهٔ نرمافزار، به خصوص نرمافزارهای بزرگ و پیچیده، هرگز از عهدهٔ یک دولوپر برنمیآید، اما خیلی از دولوپرها را هم میبینیم که روی پروژههای کوچک به تنهایی کد میزنند و اگر هم نیاز باشد، بالااجبار در داخل یک تیم مشغول به کار میشوند اما حدس میزنم (که میتواند ۱۰۰٪ اشتباه هم باشد) که عموم دولوپرها از تنهایی لذت میبرند و من هم از این قاعده مستثنی نیستم.
در واقع، ماهیت این حرفه باعث میگردد تا آدم به مرور به لپتاپ، مانیتور، ادیتور و کدها عادت کند و به مرور از دیگران گریزان گردد. کدنویسی باعث شد که من بیش از پیش درونگرا و جامعهگریز شوم و این قضیه تا جایی پیش رفته که اگر بنا به هر دلیلی مجبور شوم برای کار برای مدت طولانی در جامعه باشم، چند روزی نیاز به ریکاوری داشته باشم تا دوباره شرایطم اِستِیبل (باثبات) شود.
نکتهٔ دیگر این است که کد هیچوقت به شما دروغ نمیگوید! به عبارتی:
$var = null;
if ($var)
// do something
در کد فوق امکان ندارد که ما بتوانیم وارد ایف شویم اما در کمال ناباوری در مورد روابط اجتماعی ما آدمها اصلاً اینگونه نیست. یک زمانهایی است که طرف مقابل با شما خوشوبش میکند اما میدانید که از شما متنفر هست، یک زمانهایی هست که طرف حوصلهٔ هیچکس را ندارد، اما اصرار دارد که مثلاً به منزلش برویم، یک زمانهایی هست که فکر میکنیم طرف مقابل با ما روراسته، اما در عمل میبینیم که اصلاً اینگونه نیست و مسائلی از این دست منجر میشه که منِ دولوپر هی به مقایسهٔ پروسهٔ کدنویسی که در آن همه چیز شفاف هست با روابط اجتماعی مابین آدمها بپردازم و در نهایت به این نتیجه برسم که ترجیح میدهم با کدها سروکله بزنم تا آدمها حتی اگر کدها باگدار باشند!
مطالعهٔ بیشتر
فعالیت در حوزهٔ توسعهٔ نرمافزار کاری به معنای واقعی کلمه دشوار است. هر کسی که بگوید کدنویسی راحته، به نظرم بخشی از واقعیت رو داره میپوشونه و همین سختی کار باعث میشه که دائم مجبور باشی بخونی به طوری که میزان مطالعهٔ کل زندگیام قبل از ۳۰ سالگی (با احتساب تمامی درسهایی که در دوران تحصیل خواندهام) یک دهم میزان مطالعهام پس از ۳۰ سالگی که دست به کد شدم نیست و جالب است بدانید که این مطالعه فقط محدود به مباحث فنی نمیشود بلکه برای بدیهیترین چیزها هم عادت کردم که سرچ کنم (این قضیه تا جایی پیش رفته بود که به مطالعه معتاد شده بودم و صبحها به عشق کتاب خوندن از خواب بیدار میشدم که در نهایت دیدم از کار و زندگی افتادهام و خودم رو مجبور کردم فعلا دیگه کتاب نخونم تا کمی زندگیام تعادل پیدا کنه.)
دیسیپلین
اگر سورسکد نظم نداشته باشه، اگرچه چنانچه باگفیری باشه کار خواهد کرد، اما ریفکتور کردنش پدر آدم رو در خواهد آورد حال چه رسد به اینکه سورسکد مشکل هم داشته باشد. بدون شک یکی از مزایایی که کدنویسی به همراه خواهد داشت، دیسیپلین (نظم) است که در جایجای زندگی آدم نمود عینی پیدا میکند اما یک چیز را فراموش نکنیم و آن هم اینکه نظم از نگاه یک بکاند دولوپر به مراتب متفاوتتر از یک فرانتاند دولوپر و آدمهای عادی است.
اگر میگویم که شما پس از ورود به این حوزه منظم میشوید، این اصلاً بدان معنا نیست که مثلاً میز کار شما منظم خواهد بود یا اینکه کمد لباسهای شما همچون کمد لباسهای اکثر خانمها مرتب و منظم است! بلکه این دیسیپلین به شکل دیگری نمود عینی پیدا میکند. به عبارتی، نکتهسنج، ریزبین و دقیق میشوید.
همواره در نظر گرفتن یک سولوشن دوم
وقتی که ما کد میزنیم، خیلی جاها از ساختار try catch استفاده میکنیم بدین صورت که اگر کدهای داخل try انجام نشد، داخل catch اکسپشن رو هندل کنیم و در مورد من این پارادایم شکل گرفته که همواره در زندگی غیرکاری یک catch در نظر بگیرم. مثلاً وقتی که با کسی و یا شرکتی مذاکرهای دارم انجام میدهم، با خود میگویم که ایشالا که مورد داخل try انجام میشه اما اگر نشد چه؟ فلذا با در نظر گرفتن یک catch شرایطی رو در نظر میگیرم که اگر اوضاع بر وفق مراد نبود چه باید بکنم.
ممنون که وقت گذاشتید. جای نظر، انتقاد و پیشنهاد شما در بخش کامنتینگ است.