اگر قرار بود امروز دوباره از نقطه صفر شروع کنم، مسیرم را خیلی متفاوتتر از گذشته میچیدم؛ نه به این دلیل که ابزارهای بیشتری وجود دارند، بلکه چون حالا بهتر میدانم برنامهنویسی قرار نیست مقصد باشد.
من سالار ایزدی هستم و بخش قابلتوجهی از مسیرم را با کد، پروژه و آزمونوخطا گذراندهام. وقتی به سالهای اول یادگیری برنامهنویسی نگاه میکنم، چیزی که بیشتر از همه توجهم را جلب میکند این است که چقدر انرژی صرف یاد گرفتن چیزهایی کردم که در آن لحظه واقعاً به آنها نیاز نداشتم.
آن زمان تصور میکردم هرچه زبان بیشتر، فریمورک بیشتر و تکنولوژی بیشتری بلد باشم، برنامهنویس بهتری هستم. امروز نگاه من کمی متفاوت است. اگر همین امروز میخواستم برنامهنویسی را شروع کنم، احتمالاً تکنولوژیهای کمتری یاد میگرفتم، اما عمیقتر میساختم.
من اگر امروز شروع میکردم، هدفم «برنامهنویس شدن» نبود؛ هدفم این بود که بتوانم چیزی را که در ذهنم دارم، به یک محصول واقعی تبدیل کنم.
اول از همه، یاد میگرفتم مسئله را بفهمم
یکی از اشتباهات رایج در شروع برنامهنویسی این است که خیلی زود سؤالمان تبدیل میشود به «چه زبانی یاد بگیرم؟». اگر امروز شروع میکردم، سؤال اول من چیز دیگری بود: «چه چیزی میخواهم بسازم؟»
این تغییر کوچک، مسیر یادگیری را کاملاً عوض میکند. وقتی یک هدف واقعی داشته باشی، زبان، ابزار، فریمورک و حتی معماری دیگر انتخابهای انتزاعی نیستند؛ همه آنها تبدیل میشوند به ابزارهایی برای حل یک مسئله مشخص.
یک نکته مهم
قبل از اینکه بپرسی «چه تکنولوژیای یاد بگیرم؟»، از خودت بپرس «با این تکنولوژی قرار است چه چیزی بسازم؟». این سؤال جلوی بخش بزرگی از یادگیریهای بیهدف را میگیرد.
یک زبان را انتخاب میکردم و با آن میساختم
اگر امروز شروع میکردم، درگیر انتخاب «بهترین زبان برنامهنویسی دنیا» نمیشدم. چنین چیزی عملاً وجود ندارد. زبان خوب، زبانی است که بتواند تو را از ایده به نتیجه برساند.
بسته به هدف، انتخاب من میتوانست Python، JavaScript یا TypeScript باشد. اما نکته مهمتر از انتخاب زبان این بود که مدتی طولانی با همان یک ابزار کار میکردم و سعی میکردم بهجای حفظ کردن syntax، طرز فکر حل مسئله را یاد بگیرم.
متغیر، شرط، حلقه، تابع، ساختار داده، مدیریت خطا و کار با فایل و شبکه را یاد میگرفتم؛ اما بلافاصله آنها را داخل پروژه استفاده میکردم. برای من، یادگیری زمانی واقعی میشود که چیزی ساخته شود.
کمتر یاد میگرفتم
- • فریمورکهای متعدد بدون پروژه
- • تکنولوژیهایی که هنوز به آنها نیاز نداشتم
- • آموزشهای طولانی بدون خروجی واقعی
بیشتر میساختم
- • پروژههای کوچک اما واقعی
- • ابزارهایی که خودم به آنها نیاز داشتم
- • نسخههای ناقص اما قابل استفاده
خیلی زود سراغ Git و Linux میرفتم
اگر قرار باشد فقط کدنویسی یاد بگیری، خیلی زود به یک سقف میرسی. برنامهای که روی سیستم خودت اجرا میشود با محصولی که قرار است روی یک سرور واقعی زندگی کند، دو دنیای متفاوت هستند.
به همین دلیل Git را خیلی زود وارد مسیرم میکردم. نه برای اینکه در رزومه بنویسم Git بلدم، بلکه برای اینکه از همان ابتدا یاد بگیرم تغییرات کدم را مدیریت کنم، خرابکاریها را برگردانم و بتوانم با خیال راحتتر آزمایش کنم.
Linux را هم نه بهعنوان یک سیستمعامل عجیب برای حرفهایها، بلکه بهعنوان بخشی از دنیای واقعی توسعه یاد میگرفتم. ترمینال، فایلها، permissionها، processها، SSH، package managerها و در نهایت سرور؛ اینها چیزهایی هستند که وقتی واقعاً شروع به ساختن میکنی، ارزششان را نشان میدهند.
بعد از آن، اینترنت را میفهمیدم
یکی از مهمترین تغییرات ذهنی من این بود که فهمیدم وب فقط HTML و CSS و JavaScript نیست. پشت یک دکمه ساده، ممکن است درخواست HTTP، احراز هویت، API، دیتابیس، cache، session و دهها تصمیم دیگر وجود داشته باشد.
اگر امروز شروع میکردم، HTTP، REST، JSON، DNS، cookies، authentication و مفهوم client و server را خیلی زود یاد میگرفتم. چون وقتی این مفاهیم را بفهمی، دیگر فریمورکها جعبههای جادویی نیستند.
هرچه زیرساخت را بهتر بفهمی، کمتر اسیر ابزار میشوی.
دیتابیس را فقط برای CRUD یاد نمیگرفتم
احتمالاً مثل خیلیها، اولین برخورد من با دیتابیس با ساختن چند جدول و چند عملیات ساده شروع میشد. اما اگر دوباره شروع کنم، خیلی زودتر به این فکر میکردم که داده واقعاً قلب بسیاری از محصولات است.
SQL، رابطه بین دادهها، index، transaction، constraint و طراحی درست schema را یاد میگرفتم. بعد سراغ چیزهایی مثل caching و NoSQL میرفتم؛ نه از روی مد، بلکه وقتی مسئلهای واقعاً استفاده از آنها را توجیه کند.
چیزی که دیر فهمیدم
دیتابیس فقط محلی برای ذخیره اطلاعات نیست؛ بخشی از طراحی محصول است. اگر مدل داده اشتباه باشد، خیلی از مشکلات بعدی را نمیتوان با چند خط کد تمیز حل کرد.
بهجای پروژههای آموزشی، محصولهای کوچک میساختم
این احتمالاً بزرگترین تغییر در مسیرم بود. اگر امروز شروع میکردم، کمتر Todo List میساختم و بیشتر چیزهایی میساختم که خودم واقعاً استفاده میکنم.
مثلاً یک ابزار کوچک برای مدیریت فایلها، یک ربات، یک API، یک داشبورد، یک سرویس ساده یا حتی یک ابزار خط فرمان. مهم نبود محصول چقدر بزرگ است؛ مهم این بود که از ایده به اجرا برسم.
چون پروژه واقعی تو را مجبور میکند چیزهایی را یاد بگیری که هیچ دورهای نمیتواند به شکل کامل به تو آموزش دهد: تصمیمگیری، debugging، deployment، خطاهای عجیب، محدودیت منابع، تجربه کاربر و مهمتر از همه، تمام کردن.
پروژهای که تمام میشود، حتی اگر کوچک باشد، از دهها پروژهای که فقط شروع شدهاند ارزش بیشتری برای رشد تو دارد.
هوش مصنوعی را یاد میگرفتم، اما به آن تکیه نمیکردم
اگر امروز شروع کنم، نمیتوانم هوش مصنوعی را نادیده بگیرم. اما یک تفاوت مهم وجود دارد: استفاده از AI با فهمیدن توسعه نرمافزار یکی نیست.
از AI برای تحقیق، پیدا کردن مسیر، بررسی ایدهها، تولید نمونه اولیه و حتی debugging کمک میگرفتم؛ اما سعی میکردم همیشه بفهمم کدی که وارد پروژه میشود چه کاری انجام میدهد.
به نظرم در آینده، تفاوت بین یک توسعهدهنده خوب و کسی که فقط میتواند از AI کد بگیرد، بیشتر از همیشه به درک مسئله، معماری، تصمیمگیری و توانایی تشخیص درست از غلط وابسته خواهد بود.
طراحی را هم یاد میگرفتم
نه برای اینکه طراح محصول شوم؛ برای اینکه بفهمم چیزی که میسازم قرار است چگونه دیده و استفاده شود.
فاصله، typography، hierarchy، رنگ، responsive design و تجربه کاربر را یاد میگرفتم. چون یک محصول فقط زمانی خوب نیست که درست کار کند. باید بتواند خودش را به کاربر توضیح دهد.
اینجا جایی است که برنامهنویسی برای من از یک مهارت فنی جدا میشود و به ساخت محصول نزدیکتر میشود.
معماری را دیرتر، اما عمیقتر یاد میگرفتم
یکی از وسوسههای دوران یادگیری این است که خیلی زود سراغ معماریهای پیچیده برویم. Microservice، Docker، Kubernetes، message queue و دهها مفهوم جذاب دیگر.
اگر امروز شروع میکردم، ابتدا یک سیستم ساده اما کامل میساختم. بعد وقتی واقعاً به محدودیت میرسیدم، معماری را تغییر میدادم.
دوست دارم یک اصل ساده را در این مرحله دنبال کنم: پیچیدگی را قبل از اینکه لازم شود، وارد پروژه نکن.
ساده شروع کن
ابتدا چیزی بساز که واقعاً کار کند.
اندازه بگیر
مشکل واقعی را قبل از حل کردنش پیدا کن.
بعد پیچیده کن
معماری باید پاسخ به مسئله باشد.
Debugging را یک مهارت اصلی میدانستم
اگر چیزی در مسیر برنامهنویسی یاد گرفته باشم، این است که بخش زیادی از توسعه نرمافزار نوشتن کد جدید نیست؛ فهمیدن این است که چرا کدی که نوشتهای آنطور که انتظار داشتی کار نمیکند.
برای همین از همان پروژههای اول، به جای اینکه با اولین خطا سراغ کپی کردن راهحل بروم، سعی میکردم مسئله را کوچک کنم، log بگیرم، فرضیه بسازم و مرحلهبهمرحله جلو بروم.
برنامهنویسی فقط توانایی ساختن نیست؛ توانایی پیدا کردن دلیل خراب شدن چیزی است که ساختهای.
و مهمتر از همه، یاد میگرفتم تمام کنم
فکر میکنم این مهمترین چیزی است که اگر امروز شروع میکردم، زودتر به خودم یادآوری میکردم.
شروع کردن هیجانانگیز است. ایده جدید همیشه جذاب است. انتخاب تکنولوژی جدید هم حس پیشرفت میدهد. اما ارزش واقعی زمانی ایجاد میشود که بتوانی یک پروژه را از مرحله «ایده» عبور بدهی و به جایی برسانی که شخص دیگری بتواند از آن استفاده کند.
شاید نسخه اول محصول عالی نباشد. شاید ظاهرش ساده باشد. شاید معماریاش بعداً تغییر کند. اشکالی ندارد. محصول واقعی به تو چیزی یاد میدهد که هیچ دوره آموزشی نمیتواند.
من ترجیح میدهم یک محصول ناقص اما واقعی بسازم، تا اینکه یک مهارت کامل اما بدون استفاده داشته باشم.
اگر دوباره از صفر شروع میکردم...
مسیر من احتمالاً چیزی شبیه این بود:
- ۱. مبانی برنامهنویسی — برای ساختن طرز فکر حل مسئله، نه حفظ کردن syntax.
- ۲. یک زبان و یک مسیر مشخص — بهجای پریدن بین تکنولوژیهای مختلف.
- ۳. Git و Linux — برای نزدیک شدن به محیط واقعی توسعه.
- ۴. Web و شبکه — برای فهمیدن اینکه نرمافزارها واقعاً چگونه با هم ارتباط برقرار میکنند.
- ۵. دیتابیس — با تمرکز روی طراحی داده، نه فقط ذخیره و دریافت اطلاعات.
- ۶. چند محصول کوچک واقعی — هر پروژه بهانهای برای یاد گرفتن یک مفهوم جدید.
- ۷. طراحی و تجربه کاربر — چون محصول فقط کد نیست.
- ۸. هوش مصنوعی — بهعنوان یک ابزار قدرتمند، نه جایگزین فهمیدن.
- ۹. معماری و مقیاسپذیری — زمانی که پروژه واقعاً به آن نیاز پیدا کند.
جمعبندی؛ امروز چه چیزی را متفاوت میبینم؟
اگر امروز دوباره در ابتدای مسیر بودم، احتمالاً کمتر دنبال این بودم که «چقدر برنامهنویسی بلدم» و بیشتر دنبال این بودم که «چه چیزهایی میتوانم بسازم».
چون بعد از مدتی متوجه میشوی تکنولوژیها تغییر میکنند، فریمورکها محبوب میشوند و بعد جای خودشان را به ابزارهای جدید میدهند. چیزی که باقی میماند، توانایی فهمیدن مسئله و تبدیل کردن یک ایده به یک سیستم واقعی است.
برای من، برنامهنویسی در نهایت درباره کد نیست. کد وسیله است. چیزی که واقعاً برایم جذاب است، فاصله بین یک ایده خام و لحظهای است که آن ایده بالاخره کار میکند؛ لحظهای که چیزی که فقط در ذهن تو وجود داشت، تبدیل به یک محصول واقعی میشود.
اگر قرار باشد دوباره شروع کنم، کمتر یاد میگیرم که «برنامهنویس باشم» و بیشتر یاد میگیرم که «سازنده باشم».
چون در نهایت، ارزش کدی که مینویسیم در چیزی است که با آن به دنیا اضافه میکنیم.
هنوز نظری ثبت نشده. اولین نفر باشید!