عادت های برنامه نویسان عالی
وظیفه ی عموم برنامه نویسان فقط انجام دادن یک کار است:
کد زدن!
البته کد نویسی بدون شک قلب تپنده ی شغل برنامه نویسی است اما خلاصه کردن برنامه نویسی به نوشتن کد مثل این است که یک نقاش را به ترکیب کننده ی رنگ یا یک مکانیک را به دست گرفتن ابزار خلاصه کنیم. نوشتن کد ضروری است اما تمام کاری نیست که میتوانید به عنوان برنامه نویس انجام دهید. یک برنامه نویس عالی، توانایی ها دیگر، ذهنیت متفاوت و رویکرد حرفه ای خاصی نیز دارد.
مسئله ی اصلی حل مسئله است! مسئله می تواند مربوط به برنامه نویسی، کسب و کار، تجربه ی کاربری ، تجربه ی دولوپری، امنیت و یا حتی منابع انسانی باشد! تفاوت یک برنامه نویس معمولی با برنامه نویس عالی (در موقعیت شغلی، درآمد و رویکرد و وظایف) در همین است!
بیایید باهم ببینیم که برنامه نویسان عالی چه کارهایی میکنند!
خلاصه ی مقاله:
- فراتر از کدها: برنامه نویسان بیشتر زمان خود را به کارهای جز نوشتن کد اختصاص میدهند. در نوشتن برنامه باید متخصص بود و پیشرفت کرد اما چه کارهایی از نوشتن کد مهم ترند؟
- بهینه و استوار بودن: همه چیز باید درست و روان کار کند و برنامه و کسب و کار رو به جلو بروند.
- لذت ور رفتن: کسب تجربه، ساخت و تست ابزار و فریم ورک ها و توسعه ی محصولات جانبی همیشه روحیه ی توسعه دهندگی واقعی را زنده نگه می دارد.
- دانستن علت: چگونه هر چیزی کار خاصی را انجام میدهد؟ علت مشکلات پیش آمده دقیقا همیشه جایی نیست که به نظر میرسد!
- در چهارچوب های مختلف فکر کردن: برنامه و کار ما چگونه روی باقی برنامه ها، دیگر کدها چه رفتاری نسبت به آن دارند؟ وضعیت بیزینس، برنامه و زندگی بعد از اجرای این کد چه می شود؟
- سم زدایی: دنیای بزرگی بیرون از مانیتور و IDE منتظر شماست. با آن آشتی کنید!
- هنر تخمین(اعداد، زمان، هزینه، نفر): دانستن اعداد کمک میکند که تصمیم بهتری بگیریم!
- انتقال دانش و تجربه: به افراد نه! به مسئله ها! راه حل های مشخص و درست و کاربردی میتوانند مسائل مختلفی را حل کنند.
- آسان سازی درک برای خود و دیگران: به قول مرحوم انیشتین "اگر نمیتوانید چیزی را به سادگی توضیح دهید، خودتان نیز آن را به خوبی نفهمیده اید!".
- بازی واقعی: رفاه و آسایش و زندگی خوب و آینده ی روشن تنها هدف ماست!
- مثل سگ بو بکشید: هرچیزی که رفاه و آسایش و زندگی خوب و آینده ی روشن را تهدید می کند را پیدا و منهدم کنید!
- نظر قاطع بدون پافشاری: مهم است که اعتماد به باورها و تصمیمات خود داشته باشید، اما روی آنها پافشاری نکنید و آماده ی پذیرش تغییر باشید!
- نتیجه: در نهایت موقعیت شغلی برنامه نویسی باید به کسی تبدیل شوید که هم برنامه نویس خوبی است، هم معمار خوب، هم مدیر خوب و هم یک توسعه دهنده ی کسب و کار!
فراتر از کدها
کدها ابزار کار ما هستند - مثل اره برای نجار - با استفاده از این ابزار پایه ما محصولات نهایی که سرویس ها هستند را خلق می کنیم. داشتن مهارت در استفاده از زبان، ساختارها و کد ها پایه های تمام موضوعات دیگر در کار ماست. ما با دانش خود راه حلی دیجیتالی برای مسائل مختلف را با ابزار در اخیتار خود می سازیم(تصویر ساختار پروژه ی جنگویی). البته ما روزانه کدهای مختلفی مینویسیم و گاهی اهمیت و قدرت ابزار به چشم ما نمی آید!
نوشتن برنامه و کدها با اینکه برای ما ضروری است، اما هدف اصلی نیست! هدف اصلی نوشتن کدهای هدفمند است! هدف اصلی حل مسئله با این کدهاست! اگر هزاران خط کد بنویسیم که کار خاصی نکنند عملا ما هم کار خاصی نکرده ایم!
یک برنامه نویس عالی خیلی بهینه کد می زند! نمیتوانید از بهینه بودن برنامه های خود فرار کنید و بازهم برنامه نویس خوبی باشید! به کد زیر دقت کنید که یک حلقه ی پایتونی به یک کد سریع تر و بهینه تر و یک خطی تبدیل شده است!
# for val in data:
# if val[id_key] == id_value:
# return val[key]
# generator expression of the for above
found_data = next((val[key] for val in data if val[id_key] == id_value), None)
چیزی که در پایه های برنامه نویسی یک برنامه نویس خوب یا عالی را از دیگر برنامه نویسان جدا می کند، درک عمیق و بکارگیری درست بلوک های کد است. یک برنامه نویس عالی همیشه میداند که کدی که می نویسد چطوری با دیگر اجزای برنامه یا سرویس ارتباط برقرار میکند و چقدر کدی که نوشته scalable و maintainable است.
در این مقاله قرار نیست به این مسئله بیشتر بپردازیم و میتوانید منابع مختلفی را در این زمینه به صورت عمومی یا در استک تخصصی خود پیدا کنید.
بهینه و استوار بودن
تمام دولوپرهای خفنی که دیدم کدهای کوتاه، پیچیده و بسیار بهینه می نوشتند! نمیدانم هرکدام چطوری به این وضعیت رسیده اند ولی به شخصه این کار را با مطالعه ی بیشتر یاد گرفته ام. برنامه نویسان عالی همیشه یک قدم جلوتر از بقیه ی اعضای تیم هستند. همیشه به فکر آینده ی محصولات و سرویس ها هستند و در زمان نوشتن کد آینده نگری های بی نظیری میکنند! در زمانی که وظیفه ای به آنها محول شود همه مطمئن هستند که همه چیز به درستی و با سرعت پیش خواهد رفت، چالش ها در زمان مناسب و بهینه حل می شوند و اوضاع تحت کنترل آنهاست و محصولات و سرویس ها را به اهداف مهندسی خود نزدیک و نزدیک تر میکنند.
بعضی ها فکر میکنند این بهینگی پایداری زندگی فردی یا محصول را به خطر می اندازد اما این بهینگی به معنای سرعت سرسام آور و فضایی نیست! بیشتر به شکل استوار بودن در برابر مشکلات و چالش های کاری و شغلی باید به آن نگاه کنید. قرار نیست هر کاری را به سرعت نور به اتمام برسانیم. قرار نیست برای برنامه نویس بهتری بودن کل زندگی خود را وقف کار کنیم!
بهینگی را میتوان پایداری در رشد و پیشرفت محصول نیز تعریف کرد؛ یعنی اینکه چرخ های بهبود و development در کسب و کار ما همیشه در حال چرخش است.
همه ی ما در تمامی سطوح "گیر کردن" را تجربه کرده ایم؛ یا به باگ بد و پیچیده و حل نشدنی(اولش اینطوری فکر میکردیم) خورده بودیم و یا مهارت خود را زیر سوال برده بودیم و یا کدی نوشته بودیم که نمیدانستیم چرا لعنتی قصد درست کار کردن را ندارد! در این لحظه حس کرده ایم که چرخ های development متوقف شده اند! اما بهینگی به این معناست که نگذاریم این موانع باعث تاخیر یا توقف ما شوند. درک این مسئله ممکن است سخت به نظر برسد اما با افزایش دانش و تجربه سریع تر میتوانید به راه حل مسئله فکر کنید یا منابعی را برای حل مشکل پیدا کنید و یا حتی راه حل های جایگزین پیدا کنید و از هدف نهایی دور نشوید!
توضیح بیشتر:
در واقع در مواجهه با مشکلات به یک ذهنیت فعال نیاز دارید! حتی اگر نتوانید مشکل را مستقیما حل کنید، جست و جو برای یافتن پاسخ، بهتر از کلا انجام ندادن کار یا غصه خوردن است!
گاهی مشکلات پیچیده را نیز به مشکلات کوچکتر و قابل حل و مدیریت تقسیم می کنیم.
گاهی از یک همکار با تجربه ی دیگر مشورت میگیریم.
گاهی هم کلا آن بخش مشکل دار را فعلا کنار میگذاریم و روی بخش های دیگر پروژه تمرکز می کنیم.
هدف حرکت پیوسته رو به جلو و پایداری و پیوستگی این حرکت است!
حل مسائل سخت میتواند زمان بر باشد و نباید عجله کرد. البته این مسائل باید حل شوند و حل شدن آنها هم برابر با یک یا چند قدم رو به جلو است! گاهی گرفتن ارور جدید هم پس از ساعت ها سر و کله زدن با ارور اولیه میتواند به معنی نزدیک تر شدن به حل مسئله باشد!
لذت ور رفتن
دولوپرهای عالی فقط حرفه ای یا با سواد نیستند؛ آنها علاقمند هستند! گاهی به زبان های برنامه نویسی جدید فکر میکنند، گاهی با دیدن یک فریم ورک جدید ذوق زده می شوند، گاهی ساعت ها زمان میگذارند و به دل مشکلات جدید میزنند؛ علت انجام این کارها مجبور بودن نیست! بلکه علاقه است!
کنجکاوی بیش از حد، تشنه ی یادگیری بودن، بیشتر انجام دادن و بیشتر بودن!
مشکلی با علاقمندی کم یا بی علاقگی یا کارمندی نرمال یا فریلنسری برای درآمد وجود ندارد ولی اینطوری کسی بیشتر نمی شود!
علاقمندی به شکل های مختلفی خودش را نمایش می دهد، اما نقطه ی اشتراک آنها لذتی است که از کشف به برنامه نویس دست می دهد. برنامه نویسان عالی به شدت به کشف کردن علاقه دارند.
هدف فقط دانستن و آشنایی با ابزار و تکنولوژی ها نیست. هدف فکر کردن، آزمایش کردن و بازی کردن است! ور رفتن با یک فریم ورک جدید، یک الگوریتم پیچیده و جالب، یک trend تکنولوژی! برنامه نویسان عالی به مواجهه، یادگیری، درک و تسلط به چیزهایی که دنبال میکنند علاقه دارند.
این ور رفتن ها شعله های یادگیری و ور رفتن های آینده را همیشه روشن نگه می دارد. در دنیای ما که هر ابزاری به سرعت در حال تغییر و بهبود است، اکثر آدم ها احساس می کنند که گم شده اند، یا جایگاهی ندارند و یا گیر کرده اند. با در آغوش کشیدن حس کنجکاوی و به دنبال چالش های جدید و فرصت های یادگیری بودن، دولوپرها میتوانند مهارت های خود را بروز و دقیق و علاقمندی خود را بالا نگه دارند.
این کار فقط شما را برنامه نویس بهتری نمی کند! بلکه آینده ی شغلی شما را نیز تضمین می کند.
دانستن علت
برنامه نویسی انتهای ماجرا نیست! امروزه در کار اصلی خود با سرویس های خاصی یا بخش های کوچکی از سرویس ها سر و کار داریم؛ مسئله ی اصلی اما چیز دیگری است؛ یک دولوپر عالی میداند که چرا دارد کاری را انجام میدهد.
امروزه دنیای نرم افزار بسیار پیچیده شده و نمیتوان از هیچ توسعه دهنده ای انتظار داشت که بداند دقیقا چرا تمام کارها انجام میشوند یا ابزار مختلف در تمام اجزا و لایه ها چطوری کار می کنند. قرار نیست دنیای نرم افزار را زیر و رو کنیم اما مهم است که درک عمیق و پایه ای از کار و ابزار پر استفاده ی خود داشته باشیم تا بتوانیم تصویر بزرگتری از نرم افزار و محصولات خود را در ذهن خود مجسم کنیم. چند سوال را ببینید که به درک عمیق تر کمک میکند:
- برای فرانت اند:
چگونه CSS رندر می شود؟
چگونه صفحه با Next.js رندر می شود؟
Angular چطوری عمل میکند؟
Astro چگونه چند فریم ورک را پشتیبانی میکند؟
Hydration چیه و چرا Qwik از Resumablity استفاده میکنه؟ - برای بک اند:
زبان مفسری پایتون چطوری کد ها رو اجرا میکنه؟
هسته ی V8 چطوری جاوااسکریپت رو توی سرور اجرا میکنه؟
دیزاین دیتابیس چیه و چرا همه ی فیلد ها رو توی یک کلاس نمی گذاریم و نرمالایز میکنیم؟
چرا از queue بایدی استفاده بشه؟
کی باید از redis و برای چی استفاده کنیم؟
و کلی سوال مهم دیگه! در واقع درک چرایی و چگونگی خیلی خیلی مهمه چونکه این برتری ها رو به همراه داره:
- قدرت حل مسئله:
وقتی با چالش ها مواجه میشید، با درک عمیق تر منطق ابزارتون باهاش برخورد میکنید و سریع تر حلش میکنید. حتی درک خطاها هم براتون واضح تر میشه وقتی بدونید چطوری ایجاد میشن! - درست تصمیم گرفتن:
دانش و تجربه ی شما از سیستم ها به شکل ناخودآگاه روی تک تک تصمیمات شما اثر میگذاره؛ چه سر انتخاب استک باشه، چه پروتکل ارتباطی سرویس ها، چه فانکشنال یا OOP نوشتن برنامه ها، یا حتی اینکه سریع BigO یک تابع رو با دیدنش بفهمید و درست پیاده کردن موارد مربوط به امنیت ... . در کل درک عمیق تر به یک دولوپر امکان گرفتن تصمیم های موثر، درست و سریعتر رو میده. - کم کردن فاصله ی سرویس ها و تیم ها:
برنامه نویس های عالی که توی تیم های بزرگ و چند کاره کار میکنن با درک عمیق تری که نسبت به بقیه دارن، مثل پل ارتباطی تیم ها عمل میکنن و ارتباط و همکاری رو توی تیم های بزرگ ممکن میکنن. در واقع با دانش عمیقی که دولوپرهای عالی دارن، ارتباط بین متخصص های زمینه های مختلف رو ممکن میکنن. - خلاقیت:
پیدا کردن راه حل های مناسب، بی نظیر یا خلاقانه برای مشکلات مختلف نیازمند درک عمیق از چند موضوع مختلف مربوط به مسئله هاست. برنامه نویس عالی به OOP ، یا DDD ، یا SOLID ، یا CQRS ، یا KISS فکر نمیکنه! بلکه به شکل غیر ارادی و غیر مستقیم مسائل رو با بهترین روش هایی که از دانش و سواد و تجربش بدست آورده با خلاقیت و فکر کردن حل میکنه.
هدف از گفتن این موارد این نیست که بگوییم باید در تمام حوزه ها به تسلط عمیق برسید و همه چیز را بدانید، فقط هیچ چیز را کورکورانه و ساده قبول نکنید و تا حد نیاز در بخش های مختلف مربوط به کار خود عمیق شوید و دید خود را گسترش دهید. قول میدهم که این دانش بعدا به کار شما خواهد آمد!
در چهارچوب های مختلف فکر کردن
ویژگی و عادت دیگر برنامه نویسان عالی تمرکز روی سیستم ها و ارتباط آنها به جای کد نویسی خشک و خالی است. برنامه نویس عالی هم جزییات و هم کلیات یک سیستم را میبیند و به آنها تسلط دارد. در کنار این مسئله برنامه نویسی که به این شکل به یک سیستم تسلط دارد مشکلات آن را بهتر میبیند و میتواند پیشنهاد های بهتری برای بهبود بدهد یا حتی پیشنهاد فیچر جدید بدهد! همین مسئله از برنامه نویسان عالی، مدیران و لیدهای کاربلد می سازد.
به این مسئله تفکر سیستمی نیز گفته می شود و در دنیای نرم افزار به معنای شناخت جزییات و کلیات کامپوننت های مختلف و سرویس هاست و اینکه چطوری با یکدیگر ارتباط برقرار میکنند.
این مسئله به این معنا نیست که مطمئن شوید همه ی اجزا به درستی کار میکنند! بلکه به معنای درک و فهم اثر اجزا بر کلیات محصول و اثر آن بر کسب و کار است.
به برنامه نویسانی که در این حد به سیستم ها مسلط می شوند و پیشنهادهایی در جهت بهبود یا ساخت سرویس ها و توسعه ی کسب و کارها میدهند اصطلاحا Business Developer میگوییم و این دسته از برنامه نویسان عموما درآمدهای بالایی دارند(البته تعداد Business Developer های واقعی در ایران بسیار کم است!).
یک مثال دیگر از تفکر سیستمی در نرم افزار تمرکز برنامه نویسان عالی روی انواع تست ها از unit test گرفته تا E2E test هاست.
در مورد دسته بندی تست ها بخوانید:
https://codingcogs.org/courses/python/software-development/test-categorization/
در واقع مسئله ی اصلی در تفکر سیستمی نرم افزاری درست سوال پرسیدن است. مثل:
- چرا به این کامپوننت نیاز داریم؟
- چرا این کامپوننت برای کسب و کار ضروری است؟
- اگر این کامپوننت از کار بیوفتد، چگونه روی باقی سیستم ها و دیگر کامپوننت ها اثر خواهد گذاشت؟
- چطور باید نرم افزار خود را پایدار تر و مقاوم تر طراحی کنیم؟
به شکل ساده تر نیز باید بدانید که کدی که مینویسید قرار نیست توی خلاء کار کند! هم با کاربران در ارتباط است، هم با سرویس های دیگر و حتی با یک دیتابیس خارجی! پس باید به همه چیز فکر کنید!
تعریف علمی تر تفکر سیستمی نیز موضوع را به دو دسته ی macro (بزرگ) و micro (کوچک) تقسیم میکند. بد نیست اگر در آینده به مراتب بالا تر رسیدید در مورد Systems thinking مطالعه کنید.
سم زدایی
تکنولوژی بخش جدا نشدنی زندگی ماست و به خصوص ما به عنوان دولوپر بیشتر از دیگران با آن درگیر هستیم. در زمانی که پای سیستم هستیم و در حال کار هستیم در یک حباب قرار داریم و از هیچ چیزی خارج از این حباب آگاه نیستیم! با جدا شدن از محیط کار، یوتیوب گردی، پیاده روی و مطالعه ی بیشتر و فکر نکردن به کار درهای بیشتری از دانش و تجربه و نظم ذهنی به روی ما باز خواهد شد.
در کل عدم تعادل کاری باعث افزایش استرس، burnout و بهم ریختگی ذهنی می شود.
به عنوان راه حل به شخصه توصیه میکنم 3 مسئله را در نظر بگیرید:
- رژیم غذایی مناسبی داشته باشید
- ساعت خواب منظم و خواب کافی داشته باشید
- یک تفریح یا فعالیت فیزیکی روزانه(به جز مواد مخدر) داشته باشید
دقت کنید که این کار نیز در اسکیل macro تفکر سیستمی قرار دارد. برنامه ی شما باید با دنیای بیرون ارتباط برقرار کند و هرچقدر بهتر با دنیای بیرون و مردمان آن تعامل کنید بر کار شما نیز اثر بهتری خواهد داشت.
هنر تخمین
تخمین زمانی، تخمین هزینه، تخمین منابع، تخمین performance، تخمین ظرفیت سیستم و ...
تخمین زدن یکی از مهارت های کلیدی یک برنامه نویس بی نظیر است! به شخصه همیشه مجبور به اندازه گیری و محاسبه هستم و در عموم مواقع به جز تخمین های مالی، منابع و performance باقی تخمین های من اغلب نادرست هستند! تخمین ها به تصمیمات، راه حل ها، معماری ها و هزینه کرد درست کمک می کنند.
تخمین با توجه به نیازمندی ها و برنامه ها زده می شوند و تخمین های دقیق بسیار ارزشمند هستند. برنامه نویسی که بتواند تخمین های درستی ارائه دهد بسیار بسیار ارزشمند است. برای بهبود تواناییتون در تخمین زدن میتونین با کلیک روی اینجا به مطالبی که قبلا راجب تخمین زدن گقتیم مراجعه کنید.
انتقال دانش و تجربه
یادگیری فقط جذب و کسب دانش نیست! یادگیری بکار بردن اطلاعات فراگرفته شده است. در دنیای ما یک راه حل میتواند پاسخ چند مسئله ی مختلف باشد!
ما مفاهیم را یاد میگیریم، آنها را روی مسائل مختلف تمرین میکنیم و سپس در مسائل جدیدی از آنها استفاده می کنیم. تا زمانی که زیر بنای مسئله ثابت مانده باشد، مفهوم یادگرفته شده قابل تعمیم است.
مسئله دانش برنامه نویس نیست، بلکه توانایی او برای تبدیل و بکار بردن دانش روی یک سناریوی جدید است.
در واقع مسئله پیاده سازی ذهنیت مهندسی است. چالش ها مرتبا پیش می آیند و معمولا شبیه به هم نیستند. یک راه حل برنامه نویسی ممکن است در یک چالش جواب بدهد و در دیگری نه حتی اگر چالش ها در ظاهر مشابه باشند! یک برنامه نویس عالی مهارت استفاده از توانایی ها و دانش خود برای ارائه ی راهکار مناسب برای چالش ها را دارد.
نکته:
مهم ترین مسئله به نظر شخصی من در مورد رفع چالش ها تجربه است. با هر چالشی که پشت سر می گذارید، چه سخت باشد و چه ساده، به بار تجربه ی شما افزوده می شود. هر باگی که امروز فیکس کنید، یک مهارت برای فردای شما خواهد بود.
دانشِ خالی خالی، به شما هیچ کمکی در چالش های پیچیده نخواهد کرد.
آسان سازی درک برای خود و دیگران
در دنیای مهندسی نرم افزار، مسئله فقط فهمیدن مسائل سخت نیست؛ بلکه مسئله ساده کردن مسائل سخت برای بقیه است!
در دنیای واقعی ما مرتبا با همکاران با تجربه و کم تجربه ی خود در حال گفت و گو هستیم. بارها پیش آمده که مسائلی که نسبت به آنها و راهکار آنها ترس داشتم را از یک برنامه نویس با تجربه یاد گرفتم و در نهایت فهمیدم مسئله آنقدر هم که فکر میکردم ترسناک و سخت نبوده و بارها هم مسائل و راهکارهای مختلفی را که خودم از راه سخت یاد گرفته بودم به سادگی برای بقیه توضیح دادم.
یک برنامه نویس عالی باید بتواند مسئله یا راه حل را به سادگی برای دیگر برنامه نویسان و حتی افراد عادی توضیح دهد.
توضیح ساده به افراد عادی نیز برای یک Business Developer بسیار مهم و ضروریست. چرا که باید همه ی افراد تصمیم گیر کسب و کار را با خود همراه و هم نظر کنید.
نکته ی مهم دیگر این است که دانش قرار نیست فقط برای شما باشد و اگر به اشتراک گذاشته نشود ارزشی ندارد! یک برنامه نویس عالی دیگران را به سطح خود نزدیک می کند و حتی کمک میکند که از خودش هم پیشی بگیرند!
بازی واقعی
کلافگی از deadline تسک و پروژه، فشار مدیران و سرمایه گزاران و وسوسه پیاده سازی راه حل های سریع و کوتاه مدت و غیر اصولی میتواند باعث گرفتن تصمیمات اشتباه و رویکرد اشتباه. دولوپرهای عالی میراث بی نظیر و پایدار خود را روی هر کاری باقی میگذارند. شاید پیچوندن و تنبلی امروز خوشایند و ساده باشد اما تصویر آینده، تنها هدف واقعیست.
رفاه و آسایش و زندگی خوب و آینده ی روشن تنها هدف ماست!
برای پیاده سازی یک راه حل برنامه نویس عالی ناخودآگاه جواب درست این سوال ها را به خود میدهد و سپس تصمیم میگیرد:
- در گذر زمان این راه حل چه تاثیری می گذارد؟
- آیا با پیاده سازی این راه حل scale پذیری و maintainability به خطر نمی افتد؟
- آیا خودم بعدا دوباره اصلا میخوام به این راه حل نگاه کنم یا خیلی زشت و کثیفه؟
بازی واقعی امنیت شغلی و رشد و پیشرفت کسب و کار است! امنیت شغلی ما در قبال درآمد محصول و کسب و کار و افزایش درآمد ما که منجر به آینده ی بهتر می شود در گروی رشد و scale شدن محصول است. از طرفی نمیخواهیم به خاطر maintainable نبودن محصول نیاز باشد که به کسب و کار هزینه ی جذب نیروهای بیشتر تحمیل شود. چرا که این نیرو ها نیز به پول نیاز دارند.
همه چیز هم مستقیما مالی نیست. بدهی فنی ( technical debt ) گاهی پر هزینه تر از بدهی های مالی است. با ایجاد بدهی فنی عملا آینده ی کسب و کار و در نتیجه آینده ی خود را درگیر ریسک می کنید.
گاهی technical debt میتواند پایه های سالم کسب و کار را نیز بلرزاند. یک برنامه نویس عالی تنها زمانی به technical debt تن می دهد که واقعا بداند چه تصمیمی را دارد میگیرد.
مثل سگ بو بکشید
کد بد،داکیومنتیشن نامناسب، کامپوننت نادرست، معماری بد و دیزاین بد و نرمالایز نشده دیتابیس و ... میتوانند منجر به بوجود آمدن technical debt شوند. برنامه نویسان عالی از ورود این کد ها به کدبیس اجتناب میکنند و این کثافت کاری ها را بو میکشند! کیفیت کد بسیار مهم است.
کد خوب حتی نیاز به داکیومنت ندارد و خودش خودش را توضیح میدهد. خوانا، تمیز و ماژولار است. بهینه است و خیلی پیچیده نیست. maintainable است.
برای بو کشیدن کدهای بد و نوشتن کدهای خوب به تجربه و دیدن و نوشتن کدبیس های مختلف نیاز دارید. با این کار در آینده میتوانید الگوهای خوب و بد را تشخیص داده و با یک نگاه پیدا کنید. هدف باید ایجاد غریضه و تحلیل ناخودآگاه باشد که با تجربه به آن دست پیدا می کنید.
نظر قاطع بدون پافشاری
با افزایش تجربه طبیعتا نسبت به ابزار، تکنولوژی ها و روش ها نظرات شخصی خود را پیدا میکنید. فکر میکنید که نظر شما نسبت به نظر دیگران بهتر است ولی در واقعیت این مسئله نسبی است و ممکن است نظر شما (درست یا غلط) در یک پروژه یا تیم یا کسب و کار، کار کند و در دیگری نه! راه حل خفن شما از دید دیگری ممکن است احمقانه و پیش پا افتاده باشد. همیشه هم نبردهای مقدسی بین برتری زبان های برنامه نویسی و فریم ورک ها یا سیستم عامل در جریان است.
این ها نظرات شخصی ما هستند که در طول عمر کاری خود به آنها رسیده ایم. داشتن نظر قطعی و محکم خوب است و نشان دهنده ی تعامل و علاقه ی برنامه نویس با ساخته های خود و استک مورد علاقه ی خود است و همیشه نشانگر سطحی(بالا یا پایین، خوب یا بد) از تخصص برنامه نویس هستند.
برنامه نویسان عالی در کنار داشتن نظرات شخصی مهم و بایاس شده(مثل بقیه)، نسبت به نظرات خود انعطاف پذیری بیشتری نشان می دهند و از نقد نظراتشان استقبال میکنند. چه زبان برنامه نویسی، چه انتخاب ابزار، چه متدلوژی و چه مهندسی سیستم همگی از دید برنامه نویس درست و حسابی، نقد پذیر هستند.
چسبیدن به یک نظر با وجود نقدهای درست مخالف و وجود اطلاعات تکمیلی جدید، نوع بسیار بدی از خریت است و کسب و کار و آینده ی شغلی همه ی سازمان را تهدید میکند. با این کار عملا یک کشتی در حال غرق میسازید و همه را با خود غرق میکنید.
بهترین توصیه ای که میکنم این است که:
همانقدری که به نظر خود اطمینان دارید، همانقدر هم در مقابل تغییر انعطاف داشته باشید. نظرات مختلف را بشنوید و سبک و سنگین و تحلیل کنید. انعطاف پذیری ضعف شما را نشان نمی دهد؛ بلکه بلوغ، قدرت و تعهد شما را نشان میدهد.
نتیجه
هدف اصلی واقعا مالکیت بخشی از کسب و کارهای بزرگ است. برنامه نویسان کارکشته و عالی معمولا با پیشنهاد دریافت سهام شرکت های ارزشمند در مسیر شغلی خود رو به رو می شوند. این سهام بیشتر از حقوق نرمال برنامه نویسان ارزش خواهد داشت و آینده ی برنامه نویسان عالی اینگونه روشن می شود.
در کل هر نقطه ای که هستید راه درازی در پیش دارید. دنبال کسب تجربه، گرفتن نقد و فیدبک و یادگیری مداوم باشید و مطمئن باشید که با این کار میتوانید آینده ی روشنی را برای خود متصور شوید. برنامه نویسی همیشه فقط نوشتن کد و پوزیشن های جونیور و میدلول و سینیور یا فریلنسری نخواهد ماند و با کسب تجربه و دانش آینده ی زیبایی در انتظار شماست.
ضمنا بد نیست که در ابتدای کار همیشه به کار تیمی در پوزیشن مناسب و در تیم های خوب باشید و از فریلنسری دوری کنید. فریلنسرها عموما از نقد شدن درست و حسابی و فیدبک های تیمی و کسب و کاری به دور هستند و عملا با تمرکز روی فریلنسری آینده ی خود را در معرض ریسک قرار می دهید.